2011-10-30 9 views
3

こんにちは私は、呼び出し元のコードに保留中のトランザクションがある場合、データベースからの読み取りに問題があります。このように:IsolationLevel.ReadUncommittedブロッキングSQL Server 2008への別の接続での読み取り

f1() { 
DbTransaction t = Connection1.BeginTransaction(IsolationLevel.ReadUncommitted); 
    ... 
    f2(); 
    ... 
    t.Commit(); 
} 

f2() { 
    Connection2.Execute("SELECT..."); 
} 

f2()を呼び出すとタイムアウト例外が発生します。

私はIsolationLevelがdbへの読み取りアクセスを許可すると考えていたので、その動作は私にとって驚くべきことでした。トランザクションをf1()から削除すると、問題は消えます。

私はこれについてコメントしてくれてありがとう、この問題を解決する方法を教えてください。私は取引を維持したいと思います!

(Visual Studioの2010のC#、.NET 4.0、SQL Server 2008の互換性レベル80)

+3

コミットされていないデータを読み取るようにconnection1に指示しました。あなたはそれを接続2に話していません。 – BNL

答えて

2

あなたはF2で別の接続インスタンスを開いている理由は、私が(わからない)の両方の接続がしているように見えるよう同じDBとDBサーバー。 Connection1インスタンスをf1()からf2()メソッド呼び出しに渡して再利用するだけで済みます。

f1() 
{ 
    ... 

    f2(Connection1); 

    ... 
} 

f2() 
{ 
    Connection1.Execute(SELECT...); 
} 
4

@Vijayが言うように、それはあなたがここで2番目の接続を作成する必要のように見えるしていませんので、この問題は簡単に同じ接続を使用することによって解決されます。

あなたの最初の接続が排他ロックを作成することができREAD UNCOMMITTEDの分離レベルで実行されている:

は参考のために、しかし、第二の接続が遮断されている理由を説明します。 Connection1を作成してからf2()を呼び出すまでの間に、排他ロックを作成する何らかの操作を行い、f2()によって実行されたステートメントをブロックします。このステートメントは、デフォルトの分離レベルREAD COMMITTEDで実行されます。

ロックで何が起きているのかを確認するには、2つのSSMSウィンドウを開きます。最初のウィンドウでは、これらのステートメントを実行します。

set transaction isolation level read uncommitted 
go 

begin transaction 
-- alter some data 
delete MyTable 
waitfor delay '00:00:15' 

rollback transaction 

秒のウィンドウでは、MyTableのロックを確認するためにsp_lockを実行します。

0

これらのトランザクションを開始するには、usingステートメントでTransactionScopeを使用することをお勧めします。それ以外は、Vijayが推奨するように接続を再利用してください。

問題は、最初の接続からアンビエントトランザクションを継承した同じデータベースへの2番目の接続に関係していると思います。データベースプロバイダが同じ接続内の同じデータベースサーバーへの複数の接続をサポートするかどうかはわかりません。

2番目のSELECTがブロックされている間は、常にSQL Studioを開いてアクティブなロックのリストを確認することができます。ブロックされているものを正確に見つける簡単な方法。

関連する問題