Tom: LOCK für mysql

Beitrag lesen

Hello,

Wie kann ich eine MYSQL-Datenbank locken?

Mit dem entsprechenden SQL-Statement
http://dev.mysql.com/doc/refman/5.1/en/lock-tables.html
und den entsprechenden Rechten zur Nutzung des Statements.

Außerdem muss mann bei MySQL nicht immer gleich die ganze Tabelle sperren, sondern es reicht meistens ein Datensatz.

Locking-Strategien für verbindungslose Protokolle sind aber wesentlich komplexer.
Man arbeitet da meistens mit einem Conlict Counter und "Optimistischem Locking".
Das bedeutet, dass der Satz erst dann gesperrt wird, wenn die Änderung vorgenommen werden soll. Das ist bei MySQL aber gar nicht notwendig, weil jedes Statement atomar gekapselt abgewickelt wird.
Der Conflict Zähler ist einfach ein zusätzliches Datenbankfeld, dass bei jedem Update heraufgezählt wird. Zählen ist sicherer als ein Timestämp, denn der könnte auf schnellen Systemen zu granular sein! Wenn der Timestamp sich dann zwischen dem Holen der Daten und dem Wegschreibversuch geändert hat, ist dieser ja erfolglos.

Update TABELLE where ID = $id and counter = $counter set ...

Um herauszufinden, obbes am Counter oder der ID gelegen hat, kann man den Datansatz dann ggf. nochmals holen lassen.

Notwendig ist ein Locking eher für Satzgruppen, die durch mehrere __innerhalb__einer__Verbindung__ liegende Statements abhängig voneinander geändert werden sollen.

Harzliche Grüße vom Berg
http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau