Wenn du dich über Transactions informiert hast, wirst du wissen, wie das funktioniert^^
Transaktionen sind ein in sich geschlossener Prozess.
Zum Beispiel:
Code:
START TRANSACTION
UPDATE `Tabelle` SET `Feld` = NULL
COMMIT
Würde alle Felder namens Feld der Tabelle Tabelle auf Null setzen.
Da es eine Transaktion ist, kann zwischenzeitlich keine andere Abfrage "reinfummeln". Du brauchst also nicht mit locks zu arbeiten. Die Transaktion hat erst auf deine Datensätze eine Auswirkung, wenn sie komplett abgeschlossen ist, und dann auf alles gleichzeitig.
Angenommen folgende Situation:
Benutzer A macht ein Update und setzt alle Felder "Geld" auf 0, anschließend mach er ein weiteres Update und setzt alle Felder "Geld" auf 200. Dann fällt ihm auf, das das völliger Schwachsinn war, und macht alles Rückgängig.
Benutzer B kommt zwischendrin und liest das Geld aller Benutzer aus.
Was kann passieren (nach deiner Problemstellung):
Mysql überschreibt alles mit 0, dann mit 200. Mitten drin fragt Benutzer B ab und bekommt ein paar Datensätze die noch auf 0 stehen und ein paar die schon auf 200 stehen (weil er mitten drin abgefragt hat).
Benutzer A
Code:
START TRANSACTION
UPDATE Tabelle SET Geld = 0
UPDATE Tabelle SET Geld = 200
ROLLBACK
Benutzer B
Code:
SELECT Geld FROM Tabelle
Die Abfrage (Transaktion) von Benutzer A wird erst ausgeführt wenn ein COMMIT (Absenden) oder ROLLBACK (Abbrechen) gesendet wird. Und dann, werden alle Änderunge innerhalb der Transaktion "gleichzeitig" und "genau in diesem Moment übernommen". Das heißt Benutzer B kann entweder genau VOR oder genau NACH der Transaktion abfragen, und bekommt somit immer das von dir "richtige" gewünschte Ergebnis.
Es ist nicht möglich genau dann eine Abfrage zu senden, in der eines der Updates der Transaktion noch nicht fertig ist. Denn die Transaktion hat entweder gar keine Änderung gemacht, oder ist mit allem fertig. Vorher ist die änderung der einzelnen Datensätze sozusagen "nicht bekannt" für andere Abfragen.
Sendet ein Benutzer wirklich Millisekunden genau gleichzeitig eine Anfrage muss diese automatisch solange warten, bis mysql mit der Transaktion fertig ist. Erst dann wird Sie ausgeführt und liefert ein Ergebnis zurück.
Sollte eigentlich genau das sein was du suchst.