Werden SQL-Abfragen bei Verwendung von UNION automatisch ausgeführt?

8

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.

    
Gili 08.04.2011, 16:38
quelle

3 Antworten

3

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 ...

Verbindung 1

(Annahme unter pessimistischem Read Committed Isolation Level)

%Vor%

Verbindung 2

%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.

    
Martin Smith 08.04.2011, 16:48
quelle
1

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.

    
Parris Varney 08.04.2011 16:41
quelle
1

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 ....

    
Matthew 08.04.2011 16:43
quelle

Tags und Links