2012-04-06 8 views
8

Ich habe versucht, dies mit MySQL Server 5.5:MySQL Wiederholtes Lesen und verlor Aktualisierung/Phantom liest

1), dass Transaktionsisolationsstufe gewährleistet REPEATABLE_READ ist

2) gestartet Shell-1, begann er eine Transaktion, dann einen Wert über ausgewählte

lesen

3) begonnen shell-2 begann zu lesen, eine Transaktion in ihr, dann den gleichen Wert über ausgewählte

4) in der Schale-1, den Wert aktualisiert auf den Wert + 1 und engagierte

5) in der Schale-2, aktualisiert den Wert + 1 zu schätzen und engagiert

Der Wert verlor eines seiner Updates und wurde erst jetzt von 1.

erhöht, wie ich es, RR Anwendungen verstehen shared read locks und exclusive write locks, was bedeutet, dass die Transaktionen in # 4 und # 5 oben dead-locked sein sollten, aber das ist nicht passiert.

Also entweder mein Verständnis von RR ist fehlerhaft, oder MySQL implementiert RR auf eine andere Art und Weise. Also, was ist es?

BEARBEITEN: Durch ein ähnliches Experiment wurde auch bestätigt, dass eine RR-Transaktion (t1) keine Zeilen in dieselbe Tabelle durch eine andere RR-Transaktion (t2) eingefügt hat, wenn sie auch nach t2 eine weitere Auswahl in dieser Tabelle ausführt und bevor t1 begeht. (Hier ist der Link zu diesem Experiment: http://www.databasejournal.com/features/mysql/article.php/3393161/MySQL-Transactions-Part-II---Transaction-Isolation-Levels.htm)

Bedeutet es, dass MySQL RR kümmert sich auch um Phantom-Lesevorgänge?

+0

Haben Sie serialisierbare Transaktionen versucht? http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html#isolevel_serializable – biziclop

+0

Ja, und es sieht so aus, als ob MySQL serializable shared read locks und exclusive write locks verwendet und somit einen Deadlock in der oben Fall. Also bin ich wirklich verwirrt, denn hier ist, was "JP mit Hibernate" Buch sagt: "Ein System im wiederholbaren Lese-Isolationsmodus ermöglicht weder unwiederholbare liest noch Dirty Reads. Phantom-Lesevorgänge können auftreten. Lesen Transaktionen Block schreiben Transaktionen (aber nicht andere Lese-Transaktionen), und schreiben Transaktionen alle anderen Transaktionen zu blockieren. " (Seite 456) – shrini1000

Antwort

6

MySQL entspricht nicht wirklich Repeatable Read. Sie können dies erzwingen, indem Sie die Isolationsstufe serialisierbar verwenden oder ein FOR UPDATE nach Ihren Selects setzen (siehe Beispiel unten). Dann wird das gewünschte Verhalten erreicht. In Bezug auf phantom liest, ist MySQL eigentlich strenger als notwendig ...

+0

Danke! Könnten Sie pl. eine Referenz dafür angeben, damit ich sie als Antwort akzeptieren kann? – shrini1000

+4

http://www.cs.umb.edu/~poneil/iso.pdf besagt, dass verlorene Aktualisierungen in Repeatable Read nicht möglich sind. Sie finden die Zusammenfassung auf der letzten Seite und die Diskussion über diese spezifische Anomalie irgendwo in der Mitte (suchen Sie einfach nach "lost update"). Ich kann Ihnen nicht mehr Referenzen geben, ich hoffe, es ist genug für jetzt. – Argeman

+0

Nur um sicher zu sein: Verlorene Updates sind tatsächlich möglich, wenn InnoDB mit Repeatable Read aufgrund ihrer nicht-konformen Implementierung verwendet wird. Ist das richtig? – Basti