2012-09-26 19 views
5

Sto utilizzando il blocco di riga (transazioni) in MySQL per la creazione di una coda di lavoro. Il motore utilizzato è InnoDB.Svantaggi del blocco riga MySQL

query SQL

START TRANSACTION; 
SELECT * 
FROM mytable 
WHERE status IS NULL 
ORDER BY timestamp DESC LIMIT 1 
FOR UPDATE; 
UPDATE mytable SET status = 1; 
COMMIT; 

Secondo questa webpage,

The problem with SELECT FOR UPDATE is that it usually creates a single synchronization point for all of the worker processes, and you see a lot of processes waiting for the locks to be released with COMMIT.

Domanda: questo significa che quando viene eseguita la prima query, che prende un po 'di tempo per finire th e transazione prima, quando la seconda query simile si verifica prima che la prima transazione sia impegnata, dovrà aspettare che finisca prima che la query venga eseguita? Se questo è vero, allora non capisco perché il blocco di riga di una singola riga (che presumo) influirà sulla successiva query di transazione che non richiederebbe la lettura di quella riga bloccata?

Inoltre, questo problema può essere risolto (e ottenere ancora l'effetto di blocco della riga per una coda di lavoro) eseguendo uno UPDATE anziché la transazione?

UPDATE mytable SET status = 1 
WHERE status IS NULL 
ORDER BY timestamp DESC 
LIMIT 1 
+0

Il blocco si basa sul motore di archiviazione: che cosa stai utilizzando? –

+0

Modificato il post, il suo InnoDB – Nyxynyx

+0

Grazie (e altri 9 caratteri per andare) –

risposta

1

Se si utilizza PER UPDATE con un motore di archiviazione che utilizza pagina o riga serrature, righe esaminate dalla query sono fino alla fine della transazione corrente bloccato scrittura. L'utilizzo di LOCK IN SHARE MODE imposta un blocco condiviso che consente ad altre transazioni di leggere le righe esaminate ma non a update or delete. giro questa interrogazione

UPDATE mytable SET status = 1 
WHERE status IS NULL 
ORDER BY timestamp DESC 
LIMIT 1 

dal INNODB

acquisire automaticamente blocchi durante l'elaborazione di istruzioni SQL Credo che funziona come la stessa.