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.