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

mysql - Bloccare le righe per la query selezionata?

Il blocco nativo di MySQL non fornisce questa funzionalità. Potresti usare una colonna per eseguire i tuoi "blocchi".

Supponendo che ogni thread abbia un ID univoco, puoi creare una colonna denominata thread_owner , con valore predefinito 0.

Un thread afferrerebbe una riga come questa:

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

Quindi seleziona la riga in questo modo (potrebbe restituirne nessuna, se non ci fossero righe da elaborare):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Quindi elaboralo e infine eliminalo.

Questa soluzione funzionerebbe sia su MyISAM che su InnoDB.

Tuttavia, per InnoDB, potrebbe essere lento perché ogni istruzione UPDATE sta tentando di bloccare tutte le righe in cui thread_owner =0 e, a meno che tu non sia sicuro di bloccare tutte le righe nello stesso ordine ogni volta, potrebbe persino causare un deadlock. Quindi, potresti provare a bloccare esplicitamente l'intera tabella nella tua istruzione UPDATE:

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

In questo modo, sia MyISAM che InnoDB funzioneranno allo stesso modo.