Ich habe von vielen Anwendungsentwicklern gehört, die ein bisschen Probleme in Bezug auf Race-Bedingungen in der Datenbankverarbeitung haben. Ein typisches Beispiel geht in etwa so:Datenbank Race Conditions
- Benutzer 1 ein Feld auswählt, sagen wir, numStock, die 3
- Benutzer 2 auch wählt numStock, die noch 3
- Benutzer 1 dekrementiert numStock (in der app) und setzt es auf 2 in der Datenbank.
- Benutzer 2 dekrementiert auch numStock (in der App) und setzt es auf 2 in der Datenbank.
In diesem Beispiel sollte das Feld numStock 1 werden, wurde aber aufgrund des Wettrennens zwischen Benutzern auf 2 gesetzt.
Also natürlich können Sperren verwendet werden, aber ich habe über eine andere Art der Handhabung nachgedacht - alle Zeilendetails als WHERE-Kriterium übergeben. Lassen Sie mich erklären ...
In dem obigen Beispiel könnte die SQL-Codes wie folgt aussehen:
//
wählenSELECT itemID, numStock FROM items WHERE itemID = 45
// aktualisieren
UPDATE items SET numStock = 2 WHERE itemID = 45
Meine Idee für Lösen des Rennens:
// wählen
SELECT itemID, numStock FROM items WHERE itemID = 45
// Update
UPDATE items SET numStock = 2 WHERE itemID = 45 AND numStock = 3
So können die Abfrage prüft, ob die Daten geändert hat, seit er die Daten SELECT-ed. Also meine Frage ist: (1) Würde das [immer] funktionieren? und (2) ist dies eine bessere Option im Vergleich zu Datenbanksperrmechanismen (z. B. MySQL-Transaktionen)?
Danke für Ihre Zeit.
Können DB-Race-Bedingungen auftreten, wenn eine einzelne DB-Verbindung besteht? – arrowd
Einige Datenbanken enthalten die Option, asynchrone Prozesse auszuführen, mit diesen Funktionen können Sie sogar mit einer einzigen Verbindung Race-Bedingungen erhalten. Natürlich können diese Prozesse abhängig von Ihrer Perspektive als separate Verbindungen zählen. ... –