Wie verwaltet SqlConnection IsolationLevel?

DiesMSDN article besagt, dass

Eine Isolationsstufe hat einen verbindungsweiten Gültigkeitsbereich. Sobald sie für eine Verbindung mit der Anweisung SET TRANSACTION ISOLATION LEVEL festgelegt wurde, bleibt sie wirksam, bis die Verbindung geschlossen oder eine andere Isolationsstufe festgelegt wird. Wenn eine Verbindung geschlossen und an den Pool zurückgegeben wird, bleibt die Isolationsstufe der letzten Anweisung SET TRANSACTION ISOLATION LEVEL erhalten. Nachfolgende Verbindungen, die eine Poolverbindung wiederverwenden, verwenden die Isolationsstufe, die zum Zeitpunkt des Pools der Verbindung gültig war.

Das SqlConnection class hat kein Mitglied, das die Isolationsstufe halten kann. Woher weiß eine Verbindung, in welcher Isolationsstufe sie ausgeführt werden sol

Der Grund, warum ich das frage, ist das folgende Szenario:

Ich habe eine Transaktion mit TransactionScope im serialisierbaren Modus geöffnet, z. B. "T1".Eröffnete eine Verbindung für T1. T1 ist beendet / entsorgt, die Verbindung geht zurück zum Verbindungspool.Rief eine andere Abfrage auf derselben Verbindung an (nachdem sie vom Verbindungspool abgerufen wurde) und diese Abfrage wird im serialisierbaren Modus ausgeführt !!!

Problem

Wie weiß die Poolverbindung noch, welche Isolationsstufe damit verbunden war ???Wie kann ich es auf eine andere Transaktionsebene zurücksetzen ???

Auflösung
Der Grund, warum gepoolte Verbindungen die serialisierbare Isolationsstufe zurückgeben, ist folgender:

Sie haben einen Verbindungspool (sagen wir CP1) CP1 kann 50 Verbindungen haben.Wählen Sie eine Verbindung C1 von CP1 und führen Sie sie mit Serializable aus. Für diese Verbindung ist jetzt die Isolationsstufe festgelegt. Was auch immer Sie tun, dies wird nicht zurückgesetzt (es sei denn, diese Verbindung wird verwendet, um einen Code in einer anderen Isolationsstufe auszuführen).Nach der Ausführung der Abfrage C1 (Serializable) wird zu CP1 zurückgekehrt.Wenn die Schritte 1-4 erneut ausgeführt werden, kann es sich bei der verwendeten Verbindung um eine andere Verbindung als C1 handeln, z. B. C2 oder C3. Damit ist auch die Isolationsstufe auf Serializable eingestellt.So wird Serialzable langsam auf mehrere Verbindungen in CP1 gesetzt.Wenn Sie eine Abfrage ausführen, bei der keine explizite Einstellung der Isolationsstufe vorgenommen wird, entscheidet die von CP1 ausgewählte Verbindung über die Isolationsstufe. Für z.B. Wenn eine solche Abfrage eine Verbindung anfordert und CP1 diese Abfrage mit C1 (Serializable) ausführt, wird diese Abfrage im Modus Serializable ausgeführt, obwohl Sie sie nicht explizit festgelegt haben.

Hope das klärt ein paar Zweifel. :)

Antworten auf die Frage(8)

Ihre Antwort auf die Frage