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
Il blocco si basa sul motore di archiviazione: che cosa stai utilizzando? –
Modificato il post, il suo InnoDB – Nyxynyx
Grazie (e altri 9 caratteri per andare) –