Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Parallele Transaktionen in mysql

Es hängt alles vom ISOLATION LEVEL ab Sie eingestellt haben.

Mit dieser Abfrage können Sie sehen, welche Sie eingestellt haben:

select @@global.tx_isolation, @@session.tx_isolation;

Bevor ich die verschiedenen Isolationsstufen erkläre, möchte ich erklären, welche Probleme sie zu vermeiden versuchen:

  • Die dirty read :Daten einer noch nicht abgeschlossenen Transaktion werden von einer anderen Transaktion gelesen.

  • Das verlorene Update :Zwei Transaktionen ändern parallel einen Eintrag in einer Tabelle. Wenn beide Transaktionen abgeschlossen sind, wird nur eine Änderung angewendet.

  • Das nicht wiederholbare Lesen :Wiederkehrende Lesevorgänge führen zu unterschiedlichen Ergebnissen.

  • Das Phantom las :Während einer Transaktion fügt eine andere Transaktion Tabelleneinträge hinzu oder entfernt sie.

Nun zu den verschiedenen Isolationsstufen.

Unbestätigt lesen :
Bei dieser Isolationsstufe ignorieren Leseoperationen jegliche Art von Sperren, daher können alle oben genannten Probleme auftreten.

Lesen bestätigt :
Diese Isolationsstufe setzt eine Schreibsperre für die gesamte Transaktion auf Objekte, die geändert werden sollen. Lesesperren werden nur beim Lesen von Daten gesetzt. Daher kann es zu nicht wiederholbarem Lesen und Phantomlesen kommen.

Wiederholbarer Lesevorgang :
Mit dieser Isolationsstufe wird sichergestellt, dass wiederkehrende Lesevorgänge bei gleichen Parametern immer das gleiche Ergebnis liefern. Für Lese- und Schreibvorgänge werden Sperren für die gesamte Dauer der Transaktion gesetzt. Daher können nur Phantomlesevorgänge auftreten.

Serialisierbar :
Die höchste Isolationsstufe garantiert, dass das Ergebnis parallel laufender Transaktionen dasselbe ist, als würden die Transaktionen nacheinander ablaufen. Die meisten Datenbanken führen diese Transaktionen nicht wirklich nacheinander aus, es wäre ein zu großer Leistungsverlust. Daher kann es vorkommen, dass eine Transaktion abgebrochen wird. MySQL realisiert dies beispielsweise mit MVCC (Multi-Version Concurrency Control). Google es, wenn du mehr wissen willst. Das ist zu viel für diese Antwort.

Alles in allem erklärt es auch diese Tabelle:

                 | Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible     | possible   | possible            | possible
Read Committed   | impossible   | impossible | possible            | possible
Repeatable Read  | impossible   | impossible | impossible          | possible
Serializable     | impossible   | impossible | impossible          | impossible
  • In diesem manueller Eintrag gibt es weitere Informationen darüber und wie man die Isolationsstufe einstellt.

All dies ist nur Theorie für relationale Datenbankverwaltungssysteme. Da MySQL jedoch MVCC (Multi Version Concurrency Control) verwendet, treten keine Phantomlesevorgänge auf, wenn InnoDB und die Isolationsstufe für wiederholbare Lesevorgänge verwendet werden .
Aus dem Handbuch :