EAS_AOP分散式事務

docomo發表於2013-09-25

在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都沒有插入資料

 

相關文章