Ho cercato di capire la differenza tra i due. Documenterò ciò che ho trovato nella speranza che possa essere utile alla prossima persona.
Entrambe LOCK IN SHARE MODE
e FOR UPDATE
assicurano che nessun'altra transazione possa aggiornare le righe selezionate. La differenza tra i due è nel modo in cui trattano le serrature 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 bloccanti possono ancora leggere quella riga; LOCK IN SHARE MODE
e FOR UPDATE
sono letture di blocco).
Ciò è importante in casi come i contatori di aggiornamento, in cui si legge il valore in 1 istruzione e si aggiorna il valore in un altro. Qui utilizzando LOCK IN SHARE MODE
consentirà a 2 transazioni di leggere lo stesso valore iniziale. Quindi, se il contatore è stato incrementato di 1 per entrambe le transazioni, il conteggio del termine potrebbe aumentare solo di 1 - poiché entrambe le transazioni inizialmente leggono lo stesso valore.
L'utilizzo di FOR UPDATE
avrebbe bloccato la seconda transazione dalla lettura del valore fino al completamento del primo. Ciò assicurerà che il contatore venga incrementato di 2.
possibile duplicato di ["FOR UPDATE" v/s "LOCK IN SHARE MODE": consente ai thread concorrenti di leggere il valore "stato" aggiornato della riga bloccata] (http: // stackoverflow.com/questions/9037345/for-update-vs-lock-in-share-mode-allow-concurrent-threads-to-read-updated) –