接続プールは、接続をリサイクルする前にsp_resetconnectionを呼び出します。トランザクション分離レベルのリセットは、sp_resetconnectionが行うことのリストには含まれていません。これは、プールされた接続間で「シリアル化可能」なリークが発生する理由を説明しています。
適切な分離レベルにあることを確認することで、各クエリを開始できると思います:
if not exists (
select *
from sys.dm_exec_sessions
where session_id = @@SPID
and transaction_isolation_level = 2
)
set transaction isolation level read committed
別のオプション:異なる接続ストリングを持つ接続は、接続プールを共有しません。したがって、「シリアライズ可能な」クエリに別の接続文字列を使用する場合、それらは「コミットされた読み取り」クエリとプールを共有しません。接続文字列を変更する簡単な方法は、別のログインを使用することです。 Persist Security Info=False;
のようなランダムなオプションを追加することもできます 。
最後に、すべての「シリアル化可能な」クエリが戻る前に分離レベルをリセットすることを確認できます。 「シリアル化可能な」クエリが完了しない場合は、接続プールをクリアして、汚染された接続をプールから強制的に削除できます。
SqlConnection.ClearPool(yourSqlConnection);
これは潜在的にコストがかかりますが、クエリが失敗することはまれであるため、ClearPool()
を呼び出す必要はありません。 頻繁に。