如果在C#中使用TransactionScope类(分布式事务),则须注意如下事项:
1、在项目中引用using System.Transactions命名空间(先要在添加net组件的引用);
2、对MSDTC组件设置:
步骤:
在控制面板-->管理工具-->服务 中,开启Distributed Transaction Coordinator 服务。或者直接在运行里面输入 dcomcnfg
a.控制面板->管理工具->组件服务->计算机->我的电脑->右键->属性
b.选择MSDTC页, 确认"使用本地协调器"
c.点击下方"安全配置"按钮
d.勾选: "允许网络DTC访问","允许远程客户端","允许入站","允许出站","不要求进行身份验证".
e.对于数据库服务器端, 可选择"要求对呼叫方验证"
f.勾选:"启用事务Internet协议(TIP)事务"。
g.在双方防火墙中增加MSDTC.exe例外
可用命令行: netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable
如果只是一台主机,或者是本地测试,可以这样
今天在拿以前sqlserver中运行的好好的dts事务执行时候,在结合mysql数据库的时候,报错,报错信息:
Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported.
那么mysql到底支持分布式事务么?
答案是支持,但是有一个条件。那就是你事务里面执行的语句/存储过程,他们只能指向同一个connstr链接字符串,也就是mysql的事务,只能对同一个数据库,并且是同一个链接字符串,我今天遇到报错,就是在一个事务里面,查询了2个不同的数据库,所以就报错了。
上一下我的代码
TransactionOptions transactionOption = new TransactionOptions(); //设置事务隔离级别 transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; // 设置事务超时时间为5分10秒 transactionOption.Timeout = new TimeSpan(0, 5, 10); using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption)) { try { // 多次执行数据库的代码,我是用多个存储过程 scope.Complete(); //在Complete后面不要写代码,因为这个事务已经完成了 否则会报错
//可以看看这个报错事务报错 [Exception] 当前 TransactionScope 已完成 } catch (Exception ex) { throw new MessageJxtException(Message.操作失败本次操作没有执行); } } 关于这里面的 事务隔离级别transactionOption.IsolationLevel 可以看看
http://www.cnblogs.com/zemliu/archive/2012/06/17/2552301.html
可以参考一下这个网址的分析 http://www.cnblogs.com/nielsliu/articles/1280038.html
引发异常:Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported.
引发异常:MySQL Connector/Net does not currently support distributed transactions.
结论:MySql目前版本(MySql5.0, MySQL Connector/Net 5.2.3)支持同一个连接字符串内多个连接实例的事务,不支持不同连接字符串以及不同数据库之间的事务。
还可以参考 http://www.cnblogs.com/wonderful_morining/archive/2012/04/18/2455728.html