我有一個使用存儲過程與數據庫通信的n層C#ASP .Net應用程序服務器。在SQL中隔離提交事務
我有一個服務層,如果使用TransactionScope.requiresNew引發異常,它將回滾所有ADO .net事務。
在我的存儲過程中,我想跟蹤登錄嘗試號碼,所以我們希望保持事務框架原樣,但希望擁有我們提交的獨立事務。
我該怎麼做?
我試過在我們的數據層中使用一個新的TransactionScope.RequiresNew,但是這沒有效果。
我有一個使用存儲過程與數據庫通信的n層C#ASP .Net應用程序服務器。在SQL中隔離提交事務
我有一個服務層,如果使用TransactionScope.requiresNew引發異常,它將回滾所有ADO .net事務。
在我的存儲過程中,我想跟蹤登錄嘗試號碼,所以我們希望保持事務框架原樣,但希望擁有我們提交的獨立事務。
我該怎麼做?
我試過在我們的數據層中使用一個新的TransactionScope.RequiresNew,但是這沒有效果。
奇怪 - 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的與這些 資源管理器「內部」 交易將導致不一致的結果 ....不要混合使用兩種
嗨@nonnb,謝謝你。我壓制應該做什麼? – Russell 2010-08-14 01:59:30
經過一番閱讀(http://msdn.microsoft.com/zh-cn/library/ms973865.aspx)後,Suppress根本沒有任何事務。它也不使用我想要的環境事務。不確定我是否更喜歡交易。我有一個在我的存儲過程(BEGIN TRANSACTION,COMMIT)... – Russell 2010-08-14 03:15:41
嗨羅素 - 我編輯了我原來的文章,因爲我的評論太大了。如果你可以的話。由於聽起來您有策略來控制.NET代碼中的交易(例如服務或業務層),因此建議您從sprocs中刪除BEGIN TRAN/COMMIT TRAN - TransactionScope取代此。 – StuartLC 2010-08-15 15:59:05