5

次のようなコードを使用してクエリを実行することを想像してください。

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、これが私がこの質問をするようになった理由です。この特定のリンクは次のとおりです。 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つのクエリに対してのみ有効ですか? それとも、接続の寿命 (私のコードを調べることは、DataSet を返すとすぐに接続が閉じられることを意味します)?

Web 上のほとんどの例では、「元の分離レベルに戻す」が省略されているため、彼がそれを含めたことに私は戸惑いました。ありがとう!

4

1 に答える 1

5

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

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

あなたの場合、後で同じセッションでコミットされていないものを使用してはならない他のステートメントまたはデータセットを返す場合を除き、分離レベルをコミット済みに戻す必要はありません。リセットは単に良い方法です。

于 2013-05-24T19:34:51.663 に答える