2012-03-30 8 views
3

Während SQL-Abfragen mit Joins, muss ich Transaktionen verwenden?Benötige ich eine Transaktion für die verbundene Abfrage?

ich über so etwas wie dachte:

Delete table1, table2, table3 
FROM table1 INNER JOIN table2 ON(...) 
LEFT JOIN table3 ON (...) 
WHERE table1.column = something... 

(ich weiß nicht, ob die Syntax 100% korrekt ist, aber ich denke, dass Sie es trotzdem verstehen)

Gibt es ein Risiko, dass nicht alle Zeilen, die gelöscht werden sollen, werden nicht gelöscht?

Danke!

Antwort

4

ausgeführt werden, da dies ein einziger Befehl (DELETE) gibt es keine Notwendigkeit, explizit eine Transaktion zu verwenden. SQL-Befehle sind atomar definitionsgemäß, d. H. Sie löschen entweder alle Zeilen, die dem Kriterium entsprechen, oder überhaupt keine, wenn ein Fehler vorliegt.

EDIT: Diese Antwort ist in der Theorie korrekt und für Datenbanken, die ACID unterstützen. Wenn die Datenbanken die Atomizität nicht unterstützen oder es Fehler gibt, die ein falsches Verhalten des Datenbankmoduls auslösen, sind alle Wetten deaktiviert. Es ist jedoch unwahrscheinlich, dass die Verwendung von Transaktionen die Situation in diesen Szenarien magisch verbessern wird.

+2

Dies gilt nur für Anweisungen, die sich auf InnoDB-Tabellen auswirken. Ein Löschen gegen z.B. Eine MyISAM-Tabelle ist ** nicht ** atomar und löscht möglicherweise nur die Hälfte der Tabellen. –

+0

@a_horse_with_no_name - stimme zu, dies ist nur für ACID-Tabellen korrekt. Ich habe jedoch keine Erfahrung mit MyISAM-Tabellen, daher bin ich mir nicht sicher, ob Transaktionen in diesem Szenario helfen würden. – SWeko

+0

@SWeko In einigen Fällen wird es nicht zurückgesetzt. In MySQL v5.1 sowieso (siehe: http://bugs.mysql.com/bug.php?id=45309) – mattytommo

5

Ich glaube nicht, mit der Transaktion wird alles tun, eine einzelne Abfrage in den meisten Fällen ist atomar, und es läuft in einer einzigen Transaktion. In Bezug auf MS-SQL-Server benötigen Abfragen wie Masseneinfügung ohne Protokolle und Abschneiden möglicherweise Transaktionen. In Ihrem Fall benötigen Sie keine Transkription um Ihre Löschanweisung herum. Wenn es mehrere Aussagen sind dann müssen Sie sie in einer einzigen Transaktion wickeln, so dass alle oder keine würde Sehen Sie sich diese question

4

Nein, Sie brauchen keine Transaktion. Eine Transaktion führt dazu, dass mehrere Anweisungen als eine Einheit ausgeführt werden. Das Ausführen einer einzelnen Anweisung innerhalb oder außerhalb einer Transaktion führt immer zu identischen Ergebnissen.

Und um Ihre letzte Frage zu beantworten, ist die Aussage alles oder nichts. Die einzige mögliche Ausnahme, die ich mir vorstellen kann, wäre, wenn es mitten in der Aussage einen Stromausfall gäbe ... und eine Transaktion würde nicht helfen.

1

Für jeden INSERT, UPDATE, SELECT, DELETE Aussage gibt es keine expliziten Transaktionsbefehle, und der Datenbank-Engine wird die gesamte Anweisung Rollback, wenn ein Fehler passiert.

Verwandte Themen