sql >> Database teknologi >  >> RDS >> Mysql

mysql - Låser rækker for udvalgt forespørgsel?

Native MySQL-låsning giver ikke denne funktionalitet. Du kan bruge en kolonne til at udføre dine "låse".

Forudsat at hver tråd havde et unikt ID, kunne du oprette en kolonne med navnet thread_owner , med standard 0.

Én tråd ville fange en række som denne:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Vælg derefter rækken som denne (den returnerer muligvis ingen, hvis der ikke var nogen rækker, der skulle behandles):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Bearbejd det derefter, og slet det til sidst.

Denne løsning ville fungere på både MyISAM og InnoDB.

For InnoDB kan det dog være langsomt, fordi hver UPDATE-sætning forsøger at låse alle rækker, hvor thread_owner =0, og medmindre du er sikker på, at du låser alle rækker i samme rækkefølge hver gang, kan det endda forårsage en deadlock. Så du kan prøve eksplicit at låse hele tabellen i din UPDATE-sætning:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

På den måde vil både MyISAM og InnoDB fungere på samme måde.



  1. subselect sql-forespørgsel virker ikke på mysql 4

  2. konvertering af en varchar-datatype til en datetime-datatype resulterede i en værdi uden for området

  3. Python og Django OperationalError (2006, 'MySQL-serveren er gået væk')

  4. Hvordan refererer jeg til overordnet tabel i en multitabel join?