2008-12-04 45 views
0

我想使用System.Transaction.TransactionScope來創建一個事務來調用一些存儲過程,但它似乎並沒有自行清理。一旦事務完成(提交或未處理事務範圍對象),後續到數據庫的連接將以讀取提交級別的可序列化打開,而不是像通常那樣進行提交。System.Transaction隱式事務搞亂我的其他連接

我打開和關閉每個調用的連接(關閉並返回到正常的.NET連接池),我錯過了一些方法來顯式重置連接,當我完成了它的使用交易?我認爲System.Transaction.TransactionScope背後的想法是隱藏所有的複雜性。

所以我的代碼看起來是這樣的:

  using (var scope = new TransactionScope()) 
      { 
       ... make my 3 stored procedure calls ... 

       scope.Complete(); 

       return returnCode; 
      } 

,我猜是這樣做的正常方式。不過,如果我期待在sqlserver的探查,我可以看到被打開與

set transaction isolation level serializable 

這與後續的非交易相關的數據庫活動搞亂連接,也顯然不是那麼快。我可以通過設置一個事務選項來解決這個問題,用ReadCommited來完成事務,但在我看來這不是這個操作的理想行爲。

我也試着明確創建一個CommitableTransaction對象,創建新的事務而不是使用環境,而且仍然沒有運氣。

關於如何解決這個問題的任何想法將不勝感激,因爲任何使用可序列化連接的調用在嘗試使用readpast鎖定提示時都會引發錯誤。

回答

0

您還應該看到在池中使用同一連接之間的重置(sp_reset_connection);會不會重置隔離級別?你試過再現序列化的問題(例如,鎖升級死鎖)

+0

我確實看到了sp_reset連接。我可以逐步查看並明確關閉每個連接。你是如何重現序列化問題的?我是唯一使用系統,當我嘗試了這一點,並沒有任何死鎖(檢查跟蹤器和事務日誌記錄) – mjallday 2008-12-04 10:06:58

+0

我的意思是:你聲稱它干擾「後續非交易相關的數據庫活動」 ;我說:「你確定?」。我懷疑sp_reset_connection意味着後續數據庫活動不受此隔離級別的影響。 – 2008-12-04 21:08:13

1

使用TransactionOptions.IsolationLevel

通過default, it's serializable

TransactionOptions transactionoptions1 = new TransactionOptions(); 
transactionoptions1.IsolationLevel = IsolationLevel.ReadCommitted; 
using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionoptions1)) 
{ 
    ... make my 3 stored procedure calls ... 

    scope.Complete(); 

    return returnCode; 
} 
0

這是SQL Server的一個已知的設計決策。

此外,using new TransactionScope() Considered Harmful(06/2010;避免默認的構造函數)