Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL InnoDB:Diferença entre `FOR UPDATE` e `LOCK IN SHARE MODE`


Eu tenho tentado entender a diferença entre os dois. Vou documentar o que encontrei na esperança de que seja útil para a próxima pessoa.

Ambos LOCK IN SHARE MODE e FOR UPDATE garantir que nenhuma outra transação possa atualizar as linhas selecionadas. A diferença entre os dois está em como eles tratam os bloqueios durante a leitura de dados.

LOCK IN SHARE MODE não impede que outra transação leia a mesma linha que estava bloqueada.

FOR UPDATE impede outras leituras de bloqueio da mesma linha (leituras sem bloqueio ainda podem ler essa linha; LOCK IN SHARE MODE e FOR UPDATE estão bloqueando leituras).

Isso é importante em casos como atualização de contadores, onde você lê o valor em uma instrução e atualiza o valor em outra. Aqui usando LOCK IN SHARE MODE permitirá que 2 transações leiam o mesmo valor inicial. Portanto, se o contador foi incrementado em 1 por ambas as transações, a contagem final pode aumentar apenas em 1 - já que ambas as transações inicialmente lêem o mesmo valor.

Usando FOR UPDATE teria bloqueado a segunda transação de ler o valor até que a primeira fosse concluída. Isso garantirá que o contador seja incrementado em 2.