Ich gebe eine einzelne SQL-Abfrage aus, die aus mehreren mit UNION gruppierten SELECTs besteht:
%Vor%Angenommen, ich führe diese Abfrage unter READ_COMMITTED Transaktionsisolation aus, sind die beiden SELECT-Anweisungen garantiert atomar ausführen? Oder besteht das Risiko, dass Daten zwischen einzelnen SELECT-Anweisungen ausgetauscht werden? Spricht die SQL-Spezifikation so etwas?
KLARIFIZIERUNG : Wenn ich "Atomic" sage, meine ich nicht das "A" in ACID. Ich meine, dass ich erwarte, dass sowohl Abteilungs- als auch Mitarbeitertabellen bis zum Abschluss der Abfrage gesperrt werden.
Ja, die Aussage ist atomar, aber ja, die Daten können zwischen den beiden Lesevorgängen wechseln.
Read Committed
garantiert nur, dass Sie keine schmutzigen Daten lesen, es verspricht nichts anderes über die Konsistenz von Lesevorgängen, für die Sie eine höhere Isolationsstufe benötigen würden.
Wie Sie sagten, dass Sie ein SQL Server-Beispiel akzeptieren würden ...
(Annahme unter pessimistischem Read Committed Isolation Level)
%Vor%Gehen Sie nun zurück zu Verbindung 1
%Vor%(Denken Sie daran, zu Connection 2 zurückzukehren, um es zu beenden!)
Die spezifische Dokumentation für dieses READ COMMITED
behavior ist hier
Der freigegebene Sperrtyp bestimmt wann Es wird veröffentlicht. Zeilensperren sind freigegeben, bevor die nächste Zeile ist verarbeitet. Seitensperren sind freigegeben wenn die nächste Seite gelesen wird, und Tabelle Sperren werden bei der Anweisung freigegeben beendet.
Die Verwendung von UNION
entfernt alle doppelten Datensätze, die von einer der unionierten Abfragen zurückgegeben werden können, also nicht genau atomar. Verwenden Sie UNION ALL
, wenn Sie alle Datensätze aus allen unionierten Abfragen möchten. UNION ALL
kann viel schneller sein als UNION
auch.
BEARBEITEN: Beachten Sie, dass meine Antwort falsch ist, aber ich möchte sie nicht löschen, weil ich denke, dass sie gute Fragen enthält und gute Kommentare enthält.
Jede einzelne Transaktion ist atomar.
A UNION
mit mehreren Unterabfragen ist ein einzelner T-SQL-Befehl, eine einzelne Transaktion, und wird atomar sein.
Dies ist teilweise ein Grund, ineffiziente Abfragen (oder Sprocs) zu vermeiden, da ihre atomare Natur andere Transaktionen verzögern kann.
BEARBEITEN: Weitere interessante Informationen zur Atomarität von Unterabfragen finden Sie in dieser Frage.
Ist das Update mit verschachtelten atomaren Operationen ausgewählt?
>BEARBEITEN: Anscheinend liege ich falsch.
Dies ist eine gute Diskussion zum Thema: Atomic UPSERT in SQL Server 2005 wo Remus ein gutes Beispiel gibt. Tut mir Leid, dass ich an dir zweifle, Martin ....
Tags und Links sql transactions