0

Ich habe eine Warteschlange in meiner Datenbank (eine Tabelle hat eine Spalte, das ist eine Enumeration und hat Queue, Completed und Working-Status) und ich führe Transaktionen auf, die den bestimmten Zeilenstatus von der Arbeit in die Warteschlange ändert oder arbeiten, um abzuschließen, aber zuerst muss ich eine komplexe Abfrage ausführen, um eine Zeile auszuwählen. So jetzt, erste die Anwendung eine Auswahl läuft, wird eine Zeile, dann ein Update ausgeführt wird, um den Zustand von Queue zu Arbeiten zu ändern (innerhalb einer Transaktion, die Anwendung ist eine API, geschrieben im Frühjahr Boot- und ich benutze die jdbctemplate, um auf die MySQL-Datenbank zuzugreifen, die Methode, die ich für diesen Auswahl- und Änderungsstatus verwende, ist markiert mit @Transactional Annotation). Die Anwendung (, die die API verwendet!) ist multi-threaded, daher ist es möglich, dass zwei oder mehr dieser Transaktionen zur gleichen Zeit ausgeführt werden (mehrere Aufrufe für die API).MySQL Queue Transaktionen

Ist es möglich, sie die gleiche Zeile zurückgeben? Beispiel: T1, T2 sind Transaktionen, S1, S2 wählt, U1, U2 aktualisiert. Ausführungsreihenfolge: T1 beginnt zur gleichen Zeit wie T2

T1 { S1 --->U1 } 

    T2 { S2 ----->U2} 

Die zweite Auswahl läuft vor dem ersten Update, so dass sie beide die gleiche Zeile zurückgeben?

Antwort

0

Ja, es ist möglich, dass die 2 select -Anweisungen den gleichen Datensatz mit den gleichen Werten zurückgeben, alles hängt von der Sperr- und Isolationsstufe ab, die Sie beim Abfragen der Daten anwenden.

Siehe Understanding pdo mysql transactions SO Thema für weitere Details.

+0

Wenn ich richtig verstehe, die Isolationsstufe zu ändern, hilft mir nicht, sie können immer noch die gleichen Zeilen auswählen. – appl3r

+0

Wenn Sie eine serialisierbare Isolationsstufe verwenden, können die 2 Transaktionen nicht dieselbe Zeile auswählen. Diese Isolationsstufe bewirkt, dass MySQL jeden Datensatz sperrt, den ein Select berührt. Aber Sie können dasselbe mit expliziter Zeilensperre erreichen. – Shadow

+0

Mein Select on wählt eine einzelne Zeile aus (benutzt LIMIT 1 am Ende), also sollte die Isolationsstufe es dann tun. – appl3r