使用事務的目的是什麼?
保證事務範圍内的代碼,要麼全部執行,要麼全不執行,也就是出錯復原。
寫在資料庫腳本裡很好了解,但是用在應用程式層面,沒有看到catcha error rallback的代碼,心裡還是不踏實:
1、應用程式層面使用TransactionScope,在Scope範圍内沒有catch error并復原的代碼,是以想知道如果在Complete之前出錯,會是什麼情況?
本人設定了應用程式層面的報錯,報錯前後都有資料庫操作,執行結果: 事務自動復原
本人設定了資料庫腳本層面報錯,執行結果:自動復原
2、在程式編碼中我們仍然需要知道事物是否成功執行,實作方案是在scope外部try catch(TransactionAbortedException ex)
以下是标準文法
try
{
using (TransactionScope scope = new TransactionScope())
{
// Do Operation 1
// Do Operation 2
//...
// 如果所有的操作都執行成功,則Complete()會被調用來送出事務
// 如果發生異常,則不會調用它并復原事務
scope.Complete();
}
}
catch (TransactionAbortedException ex) {
//異常處理
writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
}
總結:
在Complete()之前,無論是出現程式級别的錯誤,還是資料庫級别的錯誤,事物都會復原。不需要寫rollback,而這些是通過架構處理的。
通過監測資料庫正在執行的事務,可以觀察事務在代碼運作過程中的狀态
檢視active transaction 的sql
select * from sys.dm_tran_session_transactions
官方文檔:
TransactionScope 類 (System.Transactions) | Microsoft Docs
更詳細更深入的用法,點選連結:
https://www.cnblogs.com/yilezhu/p/10170712.html
本文來自部落格園,作者:jiayouliucui,轉載請注明原文連結:https://www.cnblogs.com/cheery-go/p/15608322.html