2009-12-29 16 views

Antwort

54

ja, die eine in der Transaktion kann von anderen früheren Insert/Update/Delete-Anweisungen in dass Transaktion, A Select-Anweisung außerhalb der Transaktion vorgenommenen Änderungen nicht sehen kann ....

Wenn alles, was Sie fragen Über was ist die Isolation Level, dann verstehen - dass alle Select-Anweisungen (hey, alle Aussagen aller Art), - sind in einer Transaktion. Der einzige Unterschied zwischen einem, der explizit in einer Transaktion steht, und einem, der eigenständig steht, ist, dass derjenige, der alleine steht, seine Transaktion unmittelbar vor seiner Ausführung startet und unmittelbar nach der Ausführung festschreibt oder einen Rollback durchführt,

während derjenige, der explizit in einer Transaktion ist, kann (weil es eine Begin Transaction-Anweisung hat) andere Anweisungen (Einfügungen/Updates/Löschungen, was auch immer) innerhalb der gleichen Transaktion vor oder nach dieser Select-Anweisung auftreten.

Unabhängig davon, auf welche Isolationsstufe gesetzt wird, befinden sich beide Selects (innerhalb oder außerhalb einer expliziten Transaktion) dennoch in einer Transaktion, die auf dieser Isolationsstufe arbeitet.

Addition: Folgendes ist für SQL Server, aber alle Datenbanken müssen auf die gleiche Weise funktionieren. In SQL Server befindet sich der Abfrageprozessor immer in einem von drei Transaktionsmodi: AutoCommit, Implizit oder Explizit.

AutoCommit ist der Standardmodus für die Transaktionsverwaltung des SQL Server-Datenbankmoduls. .. Jede Transact-SQL-Anweisung wird festgeschrieben oder zurückgesetzt, wenn sie abgeschlossen ist. ... Wenn eine Anweisung erfolgreich abgeschlossen wurde, wird sie festgeschrieben. Wenn ein Fehler auftritt, wird ein Rollback ausgeführt. Dies ist die Standardeinstellung und ist die Antwort auf die Frage von @ Alex in den Kommentaren.

in Implicit Transaction Modus“... der SQL Server-Datenbank-Engine automatisch startet eine neue Transaktion, nachdem die aktuelle Transaktion festgeschrieben wird oder zurückgerollt Sie nichts tun, den Beginn einer Transaktion zu beschreiben;. Sie begehen oder Roll Jede implizite Transaktion generiert eine fortlaufende Transaktionskette ... "Beachten Sie, dass das kursive Snippet für jede Transaktion gilt, unabhängig davon, ob es sich um eine Transaktion mit einer oder mehrere Anweisungen handelt.

Die Engine wird im Explicit Transaction-Modus platziert, wenn Sie explizit eine Transaktion mit BEGIN TRANSACTION Statement initiieren. Dann wird jede Anweisung innerhalb dieser Transaktion ausgeführt, bis Sie die Transaktion explizit beenden (mit COMMIT oder ROLLBACK) oder wenn ein Fehler auftritt, der dazu führt, dass die Engine beendet und zurückgesetzt wird.

+1

Ich glaube, er fragt, ob es einen Unterschied gibt zwischen: "select ..." und "start transaction; select ...; stop transaction;" – tster

+0

Sehr gut gesagt! –

+0

Große Antwort. Ich war auf der Suche nach dieser Information – Davita

2

Bei der READ COMMITTED-Isolationsstufe handelt es sich um die Datensätze, die geschrieben wurden. Es hat nichts damit zu tun, ob diese Select-Anweisung in einer Transaktion ist oder nicht (außer für die Dinge, die während derselben Transaktion geschrieben wurden).

5

Ja, es gibt einen kleinen Unterschied. Bei MySQL beginnt die Datenbank erst mit Ihrer ersten Abfrage mit einem Snapshot. Es ist also nicht der Anfang, sondern die erste Aussage innerhalb der Transaktion. Wenn ich den folgenden Code:

#Session 1 
begin; select * from table; 

#Session 2 
delete * from table; #implicit autocommit 

#Session 1 
select * from table; 

Dann werde ich die gleiche Sache in der Sitzung ein beide Male erhalten (die Informationen, die in der Tabelle war, bevor ich sie gelöscht). Wenn ich die Transaktion einer Sitzung (Commit, Begin oder Rollback) abbringe und in dieser Sitzung erneut überprüfe, wird die Tabelle als leer angezeigt.

+1

Für MySQL InnoDB sind Sie absolut richtig - für InnoDB READ COMMITTED Isolationsmodus garantiert konsistente Lesevorgänge. Im allgemeinen Fall kann es jedoch zu nicht wiederholbaren Lesevorgängen kommen, die in diesem Fall auf beide Fälle (Autocommit versus ausstehende Transaktion) hinauslaufen würden, wenn Änderungen durch andere Transaktionen vorgenommen werden, sofern die Änderungen festgeschrieben wurden. –

3

Wenn Ihre Datenbank (oder in mysql die zugrundeliegende Speicher-Engine aller in Ihrer SELECT-Anweisung verwendeten Tabellen) transaktional ist, dann gibt es einfach keine Möglichkeit, sie "außerhalb einer Transaktion" auszuführen.

Vielleicht meintest du "es im Autocommit-Modus ausführen", aber das ist nicht dasselbe wie "nicht transaktional". Im letzteren Fall läuft es immer noch in einer Transaktion, es ist nur so, dass die Transaktion unmittelbar nach dem Abschluss Ihrer Anweisung endet.

In beiden Fällen wird daher während der Ausführung eine einzige SELECT-Anweisung auf der READ COMMITTED-Ebene von den anderen Transaktionen isoliert.

Nun, was dies für Ihre READ COMMITTED Transaktionsisolationsstufe bedeutet: vielleicht überraschend, nicht so viel.

READ COMMITTED bedeutet, dass Sie nicht wiederholbare Lesevorgänge feststellen können: Wenn mehrere SELECT-Anweisungen in derselben Transaktion ausgeführt werden, können Zeilen, die Sie zu einem bestimmten Zeitpunkt ausgewählt haben, von einer anderen Transaktion geändert und bestätigt werden. Sie können diese Änderungen sehen, wenn Sie die Select-Anweisung später in derselben ausstehenden Transaktion erneut ausführen. Im Autocommit-Modus würden diese 2 Select-Anweisungen in einer eigenen Transaktion ausgeführt. Wenn eine andere Transaktion die von Ihnen ausgewählten Zeilen zum ersten Mal geändert und festgeschrieben hätte, könnten Sie diese Änderungen genauso gut sehen, wenn Sie die Anweisung das zweite Mal ausgeführt haben.

Verwandte Themen