2013-05-24 9 views
5

は、ここで、このようなコードを使用してクエリを実行する想像:Read Uncommittedクエリの後、Committedに戻す必要がありますか?

using (SqlConnection TheConnection = GetSqlConnectionNoCatch(SQLConnectionStr)) 
using (SqlDataAdapter TheDataAdapter = new SqlDataAdapter(SQLStatement, TheConnection) { MissingSchemaAction = SchemaAction }) 
{ 
    DataSet TheDataSet = new DataSet(); 
    TheDataAdapter.SelectCommand.CommandTimeout = SQLTimeout; 
    TheDataAdapter.Fill(TheDataSet, TableName); 

    return TheDataSet; 
} 

とデッドロックと失敗の多くにつながる、絶対に書き込むと、砲撃、ノンストップを取得しているデータベーステーブルを読み取ることを想像しますRead Uncommitted Isolationレベルを使用してその読み取りを実行する必要があります。

私の通常のクエリであった場合:

SELECT Field1, Field2 FROM Table WHERE some_type_of_clause 

私は頻繁にあなたにそれを変更することを参照してくださいので、ここでは、この特定のリンクをこの質問をするために私を導いたものだ、

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT Field1, Field2 FROM Table WHERE some_type_of_clause 

OK: http://blog.sqlauthority.com/2011/04/17/sql-server-applying-nolock-hint-at-query-level-nolock-for-whole-transaction/

彼の例では、次があります。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
SELECT * 
FROM AdventureWorks.Sales.SalesOrderDetail sod 
INNER JOIN AdventureWorks.Sales.SalesOrderHeader soh ON 
sod.SalesOrderID = soh.SalesOrderID 
ORDER BY sod.ModifiedDate 
-- Set isolation level to original isolation level 
SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

クエリ終了時にREAD COMMITTEDに戻す必要がありますか?あるいは、私の読んだことは、その1つの質問に対してのみコミットされていますか?または、接続の寿命(Connectionがすぐに終了するように、DataSetを返すとすぐに自分のコードを調べることができます)

ウェブ上のほとんどの例は、「元の分離レベルに戻す」ということを除外しています。ありがとう!

答えて

5

ここでの答えは役に立つかもしれ:WITH (NOLOCK) vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

トランザクション分離レベルは接続レベルの設定です。つまり、ネストされたストアドプロシージャコールなどは新しい分離レベル設定を使用しますが、同じユーザーの他のユーザー/クエリウィンドウ/セッションは適用可能な既定値(または最後に設定されたもの)を使用します。

返される他のステートメントやデータセットが、同じセッションで後でコミットされないようにしない限り、分離レベルをコミットに戻す必要はありません。リセットは単なる良い方法です。

+0

緑色のチェックマークとアップコートをお返事ありがとうございました! – JustLooking

関連する問題