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

MySQL InnoDB:differenza tra `FOR UPDATE` e `LOCK IN SHARE MODE`

Ho cercato di capire la differenza tra i due. Documenterò ciò che ho trovato nella speranza che possa essere utile alla prossima persona.

Entrambi LOCK IN SHARE MODE e FOR UPDATE assicurarsi che nessun'altra transazione possa aggiornare le righe selezionate. La differenza tra i due sta nel modo in cui trattano i blocchi durante la lettura dei dati.

LOCK IN SHARE MODE non impedisce a un'altra transazione di leggere la stessa riga bloccata.

FOR UPDATE impedisce altre letture di blocco della stessa riga (le letture non di blocco possono comunque leggere quella riga; LOCK IN SHARE MODE e FOR UPDATE stanno bloccando le letture).

Ciò è importante in casi come l'aggiornamento dei contatori, in cui leggi il valore in 1 istruzione e aggiorni il valore in un'altra. Qui usando LOCK IN SHARE MODE consentirà a 2 transazioni di leggere lo stesso valore iniziale. Quindi, se il contatore è stato incrementato di 1 da entrambe le transazioni, il conteggio finale potrebbe aumentare solo di 1, poiché entrambe le transazioni inizialmente leggono lo stesso valore.

Usando FOR UPDATE avrebbe bloccato la seconda transazione dalla lettura del valore fino al completamento della prima. Ciò garantirà che il contatore venga incrementato di 2.