2010-08-13 54 views
2

我有一個使用存儲過程與數據庫通信的n層C#ASP .Net應用程序服務器。在SQL中隔離提交事務

我有一個服務層,如果使用TransactionScope.requiresNew引發異常,它將回滾所有ADO .net事務。

在我的存儲過程中,我想跟蹤登錄嘗試號碼,所以我們希望保持事務框架原樣,但希望擁有我們提交的獨立事務。

我該怎麼做?

我試過在我們的數據層中使用一個新的TransactionScope.RequiresNew,但是這沒有效果。

回答

0

奇怪 - RequiresNew內部(日誌記錄)TransactionScope應該可以工作。

在下面的嵌套事務中,TransactionScopeOption.Suppress或TransactionScopeOption.RequiresNew都適用於我 - 內部事務已提交(Dal2.x),而外部事務已中止(Dal1.x)。

try 
    { 
     using (TransactionScope tsOuter = new TransactionScope(TransactionScopeOption.Required)) 
     { 
      DAL1.Txn1(); 
      using (TransactionScope tsLogging = new TransactionScope(TransactionScopeOption.Suppress)) 
      { 
       DAL2.Txn2(); 
       tsLogging.Complete(); 
      } 
      throw new Exception("Big Hairy Exception"); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

編輯:混合的TransactionScope和明確的T-SQL事務是要避免的 - 這是在你即http://msdn.microsoft.com/en-us/library/ms973865.aspx引用相同的鏈接說明,下面引用

TransactionScopes管理事務升級很聰明 - 他們將使用(例如,只有在事務跨越多個數據庫或資源時才使用DTC,例如SQL和MSMQ)。他們還使用SQL 2005+輕量級事務處理,因此到同一數據庫的多個連接也將在事務中進行管理,而無需DTC的開銷。

恕我直言,關於是否使用Suppress vs RequiresNew的決定將取決於您是否需要在事務中執行您的審計 - RequiresNew爲孤立的txn,Suppress爲none。

當使用System.Transactions的, 應用程序不應該直接 利用事務編程 接口上的資源管理器,用於 例如,T-SQL BEGIN TRANSACTION或 COMMIT TRANSACTION動詞,或在 MessageQueueTransaction()對象 System.Messaging命名空間,當處理MSMQ的 。這些機制 會繞過 System.Transactions的處理的分佈式 事務管理,並結合 使用System.Transactions的與這些 資源管理器「內部」 交易將導致不一致的結果 ....不要混合使用兩種

+0

嗨@nonnb,謝謝你。我壓制應該做什麼? – Russell 2010-08-14 01:59:30

+0

經過一番閱讀(http://msdn.microsoft.com/zh-cn/library/ms973865.aspx)後,Suppress根本沒有任何事務。它也不使用我想要的環境事務。不確定我是否更喜歡交易。我有一個在我的存儲過程(BEGIN TRANSACTION,COMMIT)... – Russell 2010-08-14 03:15:41

+0

嗨羅素 - 我編輯了我原來的文章,因爲我的評論太大了。如果你可以的話。由於聽起來您有策略來控制.NET代碼中的交易(例如服務或業務層),因此建議您從sprocs中刪除BEGIN TRAN/COMMIT TRAN - TransactionScope取代此。 – StuartLC 2010-08-15 15:59:05