[WCF Transaction] 2. 事务演示

来源:互联网 发布:网络覆盖翻译英文 编辑:程序博客网 时间:2024/05/17 04:27

下面的代码演示了典型的 Client/Services Distributed Transaction。

// -------- Service1 -----------------

[ServiceContract]
public interface IService1
{
  [OperationContract]
  [TransactionFlow(TransactionFlowOption.Allowed)]
  void Test();
}

public class MyService1 : IService1
{
  [OperationBehavior(TransactionScopeRequired=true)]
  public void Test()
  {
    string connStr = "server=(local);uid=sa;pwd=sa;database=temp";
    using (SqlConnection conn = new SqlConnection(connStr))
    {
      conn.Open();

      SqlCommand cmd = new SqlCommand("insert into [User] ([name]) values (@name)",
        conn);

      cmd.Parameters.Add(new SqlParameter("@name", "ZhangSan"));
      cmd.ExecuteNonQuery();
    }
  }
}

// -------- Service2 -----------------

[ServiceContract]
public interface IService2
{
  [OperationContract]
  [TransactionFlow(TransactionFlowOption.Allowed)]
  void Test();
}

public class MyService2 : IService2
{
  [OperationBehavior(TransactionScopeRequired = true)]
  public void Test()
  {
    string connStr = "server=(local);uid=sa;pwd=sa;database=temp";
    using (SqlConnection conn = new SqlConnection(connStr))
    {
      conn.Open();

      SqlCommand cmd = new SqlCommand("insert into Account ([user], [money]) values (@user, @money)",
        conn);

      cmd.Parameters.Add(new SqlParameter("@user", "ZhangSan"));
      cmd.Parameters.Add(new SqlParameter("@money", 100));
      cmd.ExecuteNonQuery();
    }
  }
}

public class WcfTest
{
  public static void Test()
  {
    // -------- Host -----------------

    AppDomain.CreateDomain("Server").DoCallBack(delegate
    {
      NetTcpBinding bindingServer = new NetTcpBinding();
      bindingServer.TransactionFlow = true;

      ServiceHost host1 = new ServiceHost(typeof(MyService1), new Uri("net.tcp://localhost:8080"));
      host1.AddServiceEndpoint(typeof(IService1), bindingServer, "");
      host1.Open();

      ServiceHost host2 = new ServiceHost(typeof(MyService2), new Uri("net.tcp://localhost:8081"));
      host2.AddServiceEndpoint(typeof(IService2), bindingServer, "");
      host2.Open();
    });

    // -------- Client -----------------

    NetTcpBinding bindingClient = new NetTcpBinding();
    bindingClient.TransactionFlow = true;

    IService1 client1 = ChannelFactory<IService1>.CreateChannel(bindingClient,
      new EndpointAddress("net.tcp://localhost:8080"));
    IService2 client2 = ChannelFactory<IService2>.CreateChannel(bindingClient,
      new EndpointAddress("net.tcp://localhost:8081"));

    using (TransactionScope scope = new TransactionScope())
    {
      try
      {
        client1.Test();
        client2.Test();

        scope.Complete();
      }
      finally
      {
        (client1 as IDisposable).Dispose();
        (client2 as IDisposable).Dispose();
      }
    }
  }
}
原创粉丝点击