sql >> Database >  >> RDS >> Mysql

mysql - Rijen vergrendelen voor selectiequery?

Native MySQL-vergrendeling biedt deze functionaliteit niet. Je zou een kolom kunnen gebruiken om je "sloten" uit te voeren.

Ervan uitgaande dat elke thread een unieke ID heeft, kunt u een kolom maken met de naam thread_owner , met standaard 0.

Een thread zou een rij als deze pakken:

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

Selecteer vervolgens de rij als volgt (het zou er geen kunnen opleveren, als er geen rijen waren om te verwerken):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Verwerk het dan en verwijder het uiteindelijk.

Deze oplossing zou werken op zowel MyISAM als InnoDB.

Voor InnoDB kan het echter traag zijn omdat elke UPDATE-instructie alle rijen probeert te vergrendelen waarbij thread_owner =0, en tenzij u zeker weet dat u alle rijen elke keer in dezelfde volgorde vergrendelt, kan dit zelfs een impasse veroorzaken. U kunt dus proberen de hele tabel expliciet te vergrendelen in uw UPDATE-statement:

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

Op die manier werken zowel MyISAM als InnoDB op dezelfde manier.



  1. Context.User is NULL in Application_AuthenticateRequest via Windows auth in Asp.net MVC-app

  2. Een login.sql-bestand maken voor SQLcl

  3. Noodzaak om fdb-gegevensbestand in mysql-database te importeren

  4. Strings samenvoegen in PostgreSQL