2015-09-28 30 views
6

Qual è la differenza esatta tra i due di bloccaggio leggere clausole:MySQL InnoDB: differenza tra `PER UPDATE` e` BLOCCO DEL CAPITALE MODE`

SELECT ... FOR UPDATE 

e

SELECT ... LOCK IN SHARE MODE 

E perché voi bisogno di usare l'uno sull'altro?

+0

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) –

risposta

13

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.

+0

Secondo https://dev.mysql.com/doc/refman /5.7/it/innodb-locking-reads.html "almeno uno di essi finisce in deadlock" - non incrementando il contatore di 1 invece di 2 come hai affermato. Qualche idea per cui può verificarsi un deadlock? –