Rolf B: mySQL locking table / record - Problem mit MS Access

Beitrag lesen

Hallo Linuchs,

was Du suchst, heißt "optimistisches Sperren". Dafür brauchst Du in den Sätzen, die Du ändern willst, einen "Last Update" Timestamp. Bei jedem Update änderst Du den.

Beim Einlesen:

SELECT a, b, c, lastupdate
  FROM somedata 
 WHERE id=:idValue

Beim Update

UPDATE somedata
   SET a = :aValue, b = :bValue, c = :cValue
WHERE id = :idValue
  AND lastupdate = :readTimestamp

Und dann bekommst Du "0 Sätze geändert", wenn sich zwischenzeitlich was geändert hat. Damit das klappt, konfigurierst Du die Table so, dass die lastupdate Spalte vom Typ TIMESTAMP ist und nach jedem Update den aktuellen Timestamp annimmt. Ich hoffe, das funktioniert schon mit deinem Uralt-Mysql (du hast noch 5.5, wenn ich mich recht erinnere). Andernfalls musst Du den Timestamp bei jedem Update manuell auf NOW() setzen.

Hier steht, wie.

Anstelle eines TIMESTAMP kannst Du auch einfach einen INT nehmen und den bei jedem Update inkrementieren. Eine "Satzversion", sozusagen. Falls Du dabei einen INT-Überlauf befüchten musst, weil es für einen Satz drölftausend Änderungen pro Tag geben könnte, inkrementiere ihn modulo 1000000 oder so.

Rolf

--
sumpsi - posui - obstruxi