如果在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