在System.Transactions事務體系中,為事務提供了7種不同的隔離級別。這7中隔離級別分別通過 System.Transactions.IsolationLevel的7個列舉項表示。
public enum IsolationLevel
{
Serializable,
RepeatableRead,
ReadCommitted,
ReadUncommitted,
Snapshot,
Chaos,
Unspecified
}
7個隔離級別之中,Serializable具有最高隔離級別,代表的是一種完全基於序列化(同步)的資料 存取方式,這也是System.Transactions事務預設採用的隔離級別。按照隔離級別至高向低,7個不同的 隔離級別代表的含義如下:
* Serializable:可以在事務期間讀取可變資料,但是不可以修改,也不可以新增任何新資料;
* RepeatableRead:可以在事務期間讀取可變資料,但是不可以修改。可以在事務期間新增新資料;
* ReadCommitted:不可以在事務期間讀取可變資料,但是可以修改它;
* ReadUncommitted:可以在事務期間讀取和修改可變資料;
* Snapshot:可以讀取可變資料。在事務修改資料之前,它驗證在它最初讀取資料之後另一個事務是 否更改過這些資料。如果資料已被更新,則會引發錯誤。這樣使事務可獲取先前提交的資料值;
* Chaos:無法覆蓋隔離級別更高的事務中的掛起的更改;
* Unspecified:正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。如果設定了此值 ,則會引發異常。
先定義一個介面,Tran方法準備使用事務
namespace Drug.BLL { public interface ITranTest { void Tran(); } }
業務層程式碼
namespace Drug.BLL { [ServiceBind(typeof(ITranTest))] public class TranTest : ITranTest {
//給需要通過事務執行的方法打上Transaction標記,並設定事務隔離級別
[Transaction(System.Transactions.IsolationLevel.Serializable)] public void Tran() { Test1 t1 = new Test1(); t1.id = 1; t1.name = "Test1"; t1.Save(); Test2 t2 = new Test2(); t2.id = 1; //故意使長度超過資料庫欄位的長度,讓操作失敗 t2.tname = "Test2kkkkkkkkkkkkkkkkkkkkkkkkkkk"; t2.Save(); } } }
最後執行事務進行測試
try { ITranTest ITrans = ServiceContainer.GetService<ITranTest>(); ITrans.Tran(); MessageBox.Show("事務執行成功!"); } catch { MessageBox.Show("事務執行失敗!"); }
執行到t2.Save()的時候會提示字串將被截斷 事務操作不能成功,Test1和Test2都沒有插入資料