事務是個很精妙的存在,我們在資料層、服務層、業務邏輯層等多處地方都會使用到。
在這裡我只說下transactionscope這個微軟推薦使用的隱式事務。它是從framework 2.0開始引入的乙個事務管理類,在使用隱式事務時,事務完成前 程式應呼叫transactionscope的complete()方法,將事務提交,然後利用dispose()釋放事務物件。若執行期間出現錯誤,事務將自動回滾。
比如:using (ransactionscope scope = new transactionscope())
在這裡個人建議用using來建立,因為using實現了idispose介面,它會隱式的呼叫transactionscope物件的dispose方法,即使發生異常時也是如此,能確保在事務結束或者異常的時候也能正確的釋放資源。其實我們反編譯一下,它的內部實現就是乙個try...finally**塊,這樣也就不難理解using的作用了。
說主題,在某地市的某庫公升級中,為避免程式執行中產生髒資料以及資料更新不一致導致的重複同步情況,在可能產生上述問題的考慮下,我用這個transactionscope來對上述的操作進行事務處理。在本機的測試環境中,執行結果是正常的,當然這個執行正常的前提是資料量較小的情況下,我每次只對一條或者十幾條資料的不同表進行insert和update。然而部署到生產環境針對真實資料執行之後,發現這個事務總是回滾,一直無法正常提交。程式也就沒法正常跑起來。因為生產環境中的資料有60w左右,insert一次、update一次,最後再insert一條同步語句,前2個操作都是比較耗時的。我切換回測試環境除錯了一下,逐行執行,發現當執行完第乙個insert之後,執行第二個update時發生異常了。這個異常由transactionscope丟擲,異常提示是:事務已中止。這個錯誤,在資料量小的情況下不會發生,資料量大一些就出現了,這個是不是和事務處理的時間長短有關呢?因為我明顯感覺到在這次除錯的時候,執行的時間比之前資料量只有一條的時候長了很多,至少花費1分鐘以上。於是google一下,驗證了我的想法。
transactionscope有些過載函式是可以接受timespan型別的值,這個就是事務的超時時間了。當事務實現隔離的時候,事務範圍內的資源將會被鎖定,如果一些事務長期占有資源,那將很容易造成死鎖,為了避免這個問題,transactionscope事務會定義乙個超時限制,這個超時預設值為60秒。如果事務超過此時間,即使沒有發生異常,也會自動中止。上面問題的原因算是找到了,知道了原因,那麼也就很好解決了。我們可以在web.config 中配置:
或者在using的時候就定義好超時時間:
複製** **如下:
using (transactionscope ts = new transactionscope(transactionscopeoption.required,
new timespan(0, 5, 0)))
或者先初始化事物行為的附加資訊,然後定義超時時間:
複製** **如下:
transactionoptions topt = new transactionoptions();
topt.isolationlevel = isolationlevel.readcommitted;
//設定transactionoptions模式
topt.timeout = new timespan(0, 5, 0);
// 設定超時時間為5分qugscbyatb鐘
using (transactionscope ts = new transactionscope(transactionscopeoption.required, topt))
我這裡定義的是5分鐘,其實整個過程處理起來也就第一次處理歷史資料需要1到2分鐘時間,以後每天只需處理幾十條資料,這個程式設計客棧時間基本是秒級別的。
這裡說明下, 超時時間如果設定為0時表示超時無限長。無限長的設定主要對除錯有用,除錯過程中可能要逐步通過**來隔離業務邏輯中的問題,並且在嘗試確定問題期間不希望所除錯的事務超時。在所有其他情況下使用無限長的超時時一定要格外小心,因為它會覆蓋防止事務死鎖的保護。
本文標題: c#分布式事務的超時處理例項分析
本文位址: /ruanjian/csharp/121744.html
C 中分布式事務的超時處理問題
事務是個很精妙的存在,我們在資料層 服務層 業務邏輯層等多處地方都會使用到。在這裡我只說下transactionscope這個微軟推薦使用的隱式事務。它是從framework 2.0開始引入的乙個事務管理類,在使用隱式事務時,事務完成前 程式應呼叫transactionscope的complete ...
C 中分布式事務的超時處理問題
事務是個很精妙的存在,我們在資料層 服務層 業務邏輯層等多處地方都會使用到。在這裡我只說下transactionscope這個微軟推薦使用的隱式事務。它是從framework 2.0開始引入的乙個事務管理類,在使用隱式事務時,事務完成前 程式應呼叫transactionscope的complete ...
分布式事務分析
近期公司專案基於微服務架構需要涉及到實現一套分布式事務。經過幾天在網上查閱資料發現大部分文章只是講解了具體的其中乙個模型。因此在這裡做乙個總結 自己的一些感悟和看法。cap理論本身並不是一套和事務相關的理論,而是用來解釋分布式系統的理論。但是用來分析分布式事物的邊界非常適合。關於cap理論,可以檢視...