2015-07-22 8 views
8

Wenn ich ein SqlConnection zu einem SQL Server öffne und dann mehrere Abfragen von mehreren Hintergrundthreads ausgabe, die alle diese eine Verbindung verwenden - werden diese Abfragen sequentiell ausgeführt (kümmert sich nicht um die Reihenfolge)?Verarbeitet SqlConnection Abfragen parallel?

Insbesondere, wenn zu Beginn einer Abfrage ich die Isolationsstufe ändern und dann am Ende dieser Abfrage wiederherstellen - gibt es eine Chance, dass diese Isolationsstufe für andere Abfragen gelten kann?

Ich denke nicht, aber will bestätigen.

SQL Server 2008 R2

Und ich rede System.Data.SqlClient.SqlConnection

+3

SqlConnection ist nicht Thread-sicher. Sie sollten es nicht für mehrere Threads verwenden. Sie sollten stattdessen eine Verbindung pro Thread erstellen. –

+1

Die einzige sichere Methode, ein SqlConnection-Objekt für mehrere Threads zu verwenden, besteht darin, es nicht gleichzeitig bei mehr als 1 zu verwenden. Und ja, jeder Status oder jede Konfiguration, die Sie an einem Thread ändern, wird zu allen folgenden Threads "überlaufen" Weise. –

+0

@ LasseV.Karlsen Wie wäre es mit async/erwarten? Ich denke, THX-1138 bezieht sich auf die Möglichkeit, dass mehrere Abfragen gleichzeitig unter derselben Verbindung ausgeführt werden. –

Antwort

1

Loaded Frage, eine endgültige Antwort ist nicht möglich, da wie @ LasseV.Karlsen SqlConnection erklärt hat, ist nicht Thread-sicher so Verhalten unberechenbar sein wird . Ich habe in der Vergangenheit ähnliche Szenarien versucht und ist gescheitert. Hier ist, was ich denke, wird mit den Parametern in Ihrer Frage passieren.

Verarbeitet SqlConnection Abfragen parallel?

Nein, es weiß nicht wie, weil es nicht für diese Aufgabe entwickelt wurde. Obwohl die Tatsache, dass es möglich ist, einen Prozess zu bauen, um es auf diese Weise zu verwenden, verlockend ist.

werden diese Abfragen nacheinander Ja

ausgeführt werden. Die Abfragen werden von der SQL-Engine in der Reihenfolge ausgeführt, in der sie empfangen wurden. Obwohl Ihr Verbindungsobjekt wahrscheinlich nicht weiß, an welchen Thread die Ergebnisse weitergegeben werden sollen, erhalten Sie den gefürchteten "Objekt-Referenzfehler".

gibt es eine Chance, dass diese Isolationsstufe auf andere Abfragen anwenden

Ja. Wenn Sie die Isolationsstufe des Transaktionsobjekts ändern, das Ihrer SqlConnection zugewiesen ist, und einer Ihrer Threads versucht, diese Verbindung zu verwenden, wird diese Isolationsstufe standardmäßig verwendet. Der Zeitpunkt, an dem ein sekundärer Thread dies tut, liegt zu diesem Zeitpunkt außerhalb Ihrer Kontrolle. Sie können zuweisen eine Transaktion pro Befehl (und damit eine eindeutige Isolationsstufe wie gewünscht erreichen), aber Sie werden immer noch das Problem der Verbindung nicht threadsicher sein.