C 中分布式事務的超時處理問題

2021-07-23 17:19:11 字數 2219 閱讀 9499

事務是個很精妙的存在,我們在資料層、服務層、業務邏輯層等多處地方都會使用到。

在這裡我只說下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 中配置

: <

configuration

>

<

system.transactions

>

<

defaultsettings

timeout

="00:05:00"/>

system.transactions

>

configuration

>

using

(transactionscope ts = new

transactionscope(transactionscopeoption.required,

newtimespan(0, 5, 0)))

transactionoptions

topt = new

transactionoptions();

topt.isolationlevel = isolationlevel.readcommitted; //

設定transactionoptions模式

topt.timeout = new

timespan(0, 5, 0); // 

設定超時時間為5分鐘

using (transactionscope ts = new

transactionscope(transactionscopeoption.required, topt))

我這裡定義的是5分鐘,其實整個過程處理起來也就第一次處理歷史資料需要1到2分鐘時間,以後每天只需處理幾十條資料,這個時間基本是秒級別的。

這裡說明下,

超時時間如果設定為0時表示超時無限長。無限長的設定主要對除錯有用,除錯過程中可能要逐步通過**來隔離業務邏輯中的問題,並且在嘗試確定問題期間不希望所除錯的事務超時。在所有其他情況下使用無限長的超時時一定要格外小心,因為它會覆蓋防止事務死鎖的保護。[這段說明摘抄至msdn]

C 中分布式事務的超時處理問題

事務是個很精妙的存在,我們在資料層 服務層 業務邏輯層等多處地方都會使用到。在這裡我只說下transactionscope這個微軟推薦使用的隱式事務。它是從framework 2.0開始引入的乙個事務管理類,在使用隱式事務時,事務完成前 程式應呼叫transactionscope的complete ...

C 分布式事務的超時處理例項分析

事務是個很精妙的存在,我們在資料層 服務層 業務邏輯層等多處地方都會使用到。在這裡我只說下transactionscope這個微軟推薦使用的隱式事務。它是從framework 2.0開始引入的乙個事務管理類,在使用隱式事務時,事務完成前 程式應呼叫transactionscope的complete ...

分布式事務的問題

今天遇到乙個使用net分布式事務訪問oracle資料庫的問題,報ora 00161 事務處理的分支長度86非法 允許的最大長度為 64 的錯誤,查詢的資料,均解決不了,最後挨個檢查,終於發現了問題。描述 1 作業系統為win7 64位,安裝了2套oracle client,一套pl sql使用訪問o...