[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();
}
}
}
}
[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();
}
}
}
}
- [WCF Transaction] 2. 事务演示
- [WCF Transaction] 3. 事务投票
- 化零为整WCF(14) - 事务(Transaction)
- 化零为整WCF(14) - 事务(Transaction)
- 化零为整WCF(14) - 事务(Transaction)
- [WCF Transaction] 4. 事务与会话
- WCF分布式开发步步为赢(12):WCF事务机制(Transaction)和分布式事务编程
- Transaction 事务
- Transaction-事务
- 事务Transaction
- Transaction事务
- 事务(Transaction)
- Transaction 事务
- 事务(Transaction)
- 事务Transaction
- [事务] -- 事务(Transaction)
- WCF分布式开发常见错误(16):The Transaction has aborted,事务已经被中断
- [WCF Transaction] 1. 基本概念
- [WCF Security] 2. 安全参数设置
- [WCF Security] 3. X509 身份验证
- t:dataScroller的使用-使用binding的时候会出现的问题
- [WCF Security] 4. 用户名/密码身份验证
- [WCF Transaction] 1. 基本概念
- [WCF Transaction] 2. 事务演示
- [WCF Transaction] 3. 事务投票
- 基于消息驱动的面向对象通用C/S应用框架(一)
- 基于消息驱动的面向对象通用C/S应用框架(二)
- [WCF Transaction] 4. 事务与会话
- [WCF MSMQ] 1. 基本应用
- [WCF MSMQ] 2. 队列与事务
- 基于消息驱动的面向对象通用C/S应用框架(三)
- WCF - 只读属性