Christian Kruse: MySQL PDO Datensatz holen und sperren

Beitrag lesen

Moin Bobby,

ich habe 5 Simultane Prozesse, die sich Daten aus einer Tabelle holen und abarbeiten. Ich möchte dass dabei die Prozesse nicht die selben Daten bearbeiten. Wie kann ein Prozess einen Datensatz holen, abarbeiten und danach aus der Datenbank löschen? Wie wäre da der beste Ansatz mit PDO?

MyISAM kann keinen row level lock. Verwendest du also MyISAM, musst du zwangsläufig die Tabelle locken. Um die Lock Times möglichst kurz zu halten, würde ich an deiner Stelle hier eine zusätzliche Spalte in\_progress BOOLEAN NOT NULL DEFAULT false oder so anlegen. Dann kannst du die Tabelle locken, Datensätze auslesen bis du einen findest, der noch nicht in Bearbeitung ist, die Spalte auf true setzen und dann den Lock lösen. Für das DELETE nach Abschluss des Scrapings brauchst du dann keinen Lock mehr.

Wenn du InnoDB benutzt, reicht es in einer Transaktion einen row level lock zu machen (SELECT ... FOR UPDATE), die Spalte auf true zu setzen und dann die Transaktion zu commiten, da brauchst du den table lock nicht.

LG,
 CK