web-dev-qa-db-ja.com

「接続が閉じられてプールに戻されると、最後のSET TRANSACTION ISOLATION LEVELステートメントからの分離レベルが保持されます」?

MSDNオンライン記事「 SQL Serverのスナップショット分離 は次のように述べています。

  • 「分離レベルには接続全体のスコープがあり、SET TRANSACTION ISOLATION LEVELステートメントを使用して接続に設定すると、接続が閉じるまで有効ですまたは別の分離レベルが設定されています。接続が閉じられ、プールに返されると、最後のSET TRANSACTION ISOLATION LEVELステートメントからの分離レベルが保持されます。プールされた接続を再利用する後続の接続では、接続がプールされたときに有効だった分離レベルが使用されます

自己矛盾する段落ではありませんか(「まで」と「保持」)。

次に、接続を閉じてプールに戻した後、「最後のSET TRANSACTION ISOLATION LEVELステートメントからの分離レベルが保持される」場合、どのようにすべきか理解する:

  • デフォルトの分離レベルは任意の値になります(プール内の異なる接続は異なる分離レベルを持ち、その値は再オープンされる接続に依存します)?
  • または、プール内のすべての接続のすべてのデフォルト値が最後の値に変更されますか?しかし、手に入る前にまたかなり未知ですか?
8
Fulproof

プールからの接続には、その接続を使用する最後のクライアントによって設定された分離レベルがあります。はい、本当に怖いです。

長い点と短い点は、接続の分離レベルを変更する場合は、閉じる前に明示的にREAD COMMITTEDに戻す必要があることです。バッチの開始時に必要な分離レベルを明示的に宣言し、他の誰かがずさんなコードによって影響を受けないようにし、最後にデフォルトに戻すことをお勧めします。

この振る舞いは、困惑しながらも明らかに by-design です。

14

自己矛盾する段落ではありませんか(「まで」と「保持」)

私にはわかりませんが、他の方法で読むことができます。ドキュメントをより明確にするために更新する場合は、これを要求する適切な場所は Microsoft Connect です。ここの人々はマイクロソフトのドキュメントを管理していません。

デフォルトの分離レベルは任意の値になります(プール内の異なる接続には異なる分離レベルがあり、その値は再オープンされる接続に依存します)?

プールされた接続を再利用している場合、はい、「既存の」分離レベルは、プールされた接続が最後に閉じられたときに有効だった分離レベルです。接続時に必要な分離レベルを明示的に設定することをお勧めします。

またはプール内のすべての接続のすべてのデフォルト値が最後のものに変更されますか?しかし、前もってまだかなり不明ですか?

番号。

5
Paul White 9

SQL Server 2014では、プールされた接続の分離レベルがリセットされます ほとんどのTDSプロトコルバージョン。以前のバージョンのSQL Serverでは、分離レベルはリセットされませんでした。

3
usr