sql >> データベース >  >> RDS >> Sqlserver

SQL Server:プールされた接続間での分離レベルのリーク

    接続プールは、接続をリサイクルする前に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()を呼び出す必要はありません。 頻繁に。



    1. SQLServerでデータベースの破損に対処する方法を知る方法

    2. 単一のSQLServerステートメントはアトミックで一貫性がありますか?

    3. SQLServerで高速に実行されるOracleで低速で実行されるSELECTクエリの最適化

    4. SQLワークロード分析はどのように役立ちますか?