次のようなコードを使用してクエリを実行することを想像してください。
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 上のほとんどの例では、「元の分離レベルに戻す」が省略されているため、彼がそれを含めたことに私は戸惑いました。ありがとう!