TransactionScope und Connection Pooling

8

Ich versuche herauszufinden, ob wir ein Problem in unserer Anwendung mit Datenbankverbindungen haben, die inkorrekte Isolationsstufen verwenden. Unsere Anwendung ist eine .Net 3.5-Datenbank-App mit SQL Server 2005.

Ich habe festgestellt, dass das IsolationLevel von Verbindungen nicht zurückgesetzt wird, wenn sie an den Verbindungspool zurückgegeben werden (siehe hier ) und war auch wirklich überrascht, in diesem Blogbeitrag zu lesen, dass jedes neue erstellte TransactionScope einen eigenen Verbindungspool erhält zugewiesen zu ihm.

Unsere Datenbankaktualisierungen (über unsere Business-Objekte) finden innerhalb eines TransactionScope statt (für jede Business-Objekt-Grafikaktualisierung wird ein neues erstellt). Unsere Abrufe verwenden jedoch keine explizite Transaktion. Ich frage mich also, ob wir jemals in die Situation kommen könnten, in der unsere Fetch-Operationen (die den Standard IsolationLevel - Read Committed verwenden) eine Verbindung aus dem für eine Aktualisierung verwendeten Pool wiederverwenden und das Update IsolationLevel erben sollen (WiederholbareRead)? Oder würden unsere Updates garantiert einen anderen Verbindungspool verwenden, da sie in ein TransactionScope eingebettet sind?

Vielen Dank im Voraus,

Graham

    
Graham 11.03.2010, 14:11
quelle

2 Antworten

6

Das ist beunruhigend!

Bill Vaughans Artikel, mit dem Sie verlinkt haben, besagt, dass ... jedes TransactionScope seinen eigenen Pool bekommt, aber der Code in dem Support-Artikel, mit dem Sie verlinkt sind, würde vermuten, dass dies nicht stimmt, da der zweite Durchlauf von NoTxScope() den Verbindung vom Pool, der die erhöhte Isolationsebene verwendet hat.

Sie können das Problem durch [Ich zeichne den Code vom ersten Link]] erzwingen:

%Vor%

oder indem Sie "..;Pooling=False" zu Ihrer Verbindungszeichenfolge hinzufügen.

    
Mitch Wheat 15.03.2010, 09:02
quelle
2

In SQL Server 2014 wird die Isolationsstufe für die Poolverbindung zurückgesetzt, wenn die Verbindung zum Pool wiederhergestellt wird. In früheren Versionen ist es nicht.

Sieh diesen Forenbeitrag:

  

" in SQL 2014, für Client-Treiber mit TDS Version 7.3 oder höher, setzt SQL Server die Transaktionsisolationsstufe auf Standard (Read Committed) für gepoolte Verbindungen.Für Clients mit TDS-Version niedriger als 7.3 haben sie die alte Verhalten beim Ausführen gegen SQL 2014. "

Aktualisieren

Dies wurde wieder in das vorherige Verhalten in SQL 2014 CU6 und SQL 2014 SP1 CU1 mit diesem Fix geändert:

FIX: Die Transaktionsisolationsstufe wird falsch zurückgesetzt, wenn die SQL Server-Verbindung in SQL Server 2014 freigegeben wird

  

"Angenommen, Sie verwenden die TransactionScope-Klasse im clientseitigen SQL Server-Quellcode und öffnen die SQL Server-Verbindung nicht explizit in einer Transaktion. Wenn die SQL Server-Verbindung freigegeben wird, wird die Transaktionsisolationsstufe falsch zurückgesetzt. "

    
Thomas 04.09.2014 13:45
quelle