Bitte geben Sie einen Hinweis auf das folgende Problem: Ich habe eine Liste von eindeutigen Codes. Der Code muss nur einmal verwendet werden, daher ist jedem Code ein Status zugeordnet (verwendet/nicht verwendet).SQL - um zu sperren oder nicht zu sperren: nächsten unbenutzten Code auswählen
Ich mache mir Sorgen über Konkurrenz/Race Conditions, wenn mehrere Threads versuchen werden, nächsten unbenutzten Code zu bekommen.
Was ist der beste Weg, um es mit SQL-Datenbank (MySQL in meinem Fall) zu implementieren?
Die erste Option Sperren zu verwenden ist und schreib engagierte Isolationsstufe:
start transaction in read-committed isolation level
select code from code_table where status = 'not-used' for update
update code_table set status = 'used' where code = :code
commit transaction
Im Fall des Anstoßes der Fäden, wie ich glaube, dass „Datenbank-Threads“ auf der gesperrte Zeile stolpern, wartet, wenn die Zeilenschreibsperre nicht freigegeben wird, wird (aufgrund der Read-Committed-Isolationsstufe) sehen, dass dieser Code-Datensatz bereits verwendet wird, und zu anderen Code-Datensätzen weitergehen.
Die zweite Option ähnelt etwas zu verwenden, das optimistische Sperren in den Ruhezustand (wir verwenden Hibernate nicht), hier ist die Beschreibung der einzelnen Schritte:
start transaction in default isolation level (read-repeatable)
select code from code_table where status = 'not-used'
commit transaction
start transaction in default isolation level (read-repeatable)
update code_table set status = 'used' where code = :code
commit transaction
In Java-Code werde ich überprüfen, wie viel Datensätze wurden aktualisiert. Wenn ein Datensatz aktualisiert wird, ist alles in Ordnung, wenn 0 Datensätze aktualisiert sind - wiederhole ich den Schritt..nach der 3. (oder 5.) Probe - eine Ausnahme auslösen.
Jede Hilfe/Beratung würde sehr geschätzt werden. Vielen Dank im Voraus
Ok, entfernte sql-server .... – user3489820