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

Esempio minimo di utilizzo di select... for update per isolare le righe

SELECT ... FOR UPDATE blocca le righe in modalità esclusiva, il che significa che la seconda selezione non può procedere fino al completamento o al rollback della prima. Questo perché il risultato della seconda selezione potrebbe essere influenzato dal contenuto della riga che hai bloccato, quindi è necessario ottenere un blocco di lettura per la riga da controllare.

Se crei un UNIQUE INDEX ad esempio su id , potresti fare;

select * from SolrCoresPreallocated where id=1 for update;

nella prima transazione e;

select * from SolrCoresPreallocated where id=2 for update;

nel secondo in modo indipendente, poiché l'indice univoco consente al secondo select di trovare la riga corretta senza bloccare in lettura la prima.

EDIT:per ottenere una riga "gratuita" il più rapidamente possibile, l'unico modo è davvero fare due transazioni;

  • BEGIN/SELECT FOR UPDATE/UPDATE to Occupato/COMMIT per ottenere la riga.
  • BEGIN//UPDATE per liberare/COMMIT per elaborare la riga e rilasciarla.

Ciò significa che potresti aver bisogno di azioni di compensazione nel caso in cui un processo fallisca e annulli la transazione che AGGIORNEREBBE la riga per liberarla, ma poiché MySQL (o SQL standard per quella materia) non ha la nozione di "ottenere la riga sbloccata successiva ", non hai molte opzioni.