Como se implementa corretamente o bloqueio otimista no MySQL?
Nossa equipe deduziu que devemos fazer o item 4 abaixo ou existe o risco de que outro thread possa atualizar a mesma versão do registro, mas gostaríamos de validar que essa é a melhor maneira de fazê-lo.
- Crie um campo de versão na tabela para o qual você deseja usar o bloqueio otimista, por exemplo, nome da coluna = "versão"
- Ao selecionar, inclua a coluna da versão e anote a versão
- Em uma atualização subsequente do registro, a instrução de atualização deve emitir "where version = X", em que X é a versão que recebemos no item 2 e defina o campo de versão durante essa instrução de atualização como X + 1
- Execute um
SELECT FOR UPDATE
no registro que vamos atualizar para serializar quem pode fazer alterações no registro que estamos tentando atualizar.
Para esclarecer, estamos tentando impedir que dois encadeamentos que selecionam o mesmo registro na mesma janela de tempo em que eles capturam a mesma versão do registro substituam uns aos outros, caso tentem atualizar o registro ao mesmo tempo. Acreditamos que, a menos que façamos o número 4, há uma chance de que, se os dois threads inserirem suas respectivas transações ao mesmo tempo (mas ainda não emitiram suas atualizações), quando atualizarem, o segundo segmento que usará o UPDATE ... onde version = X estará operando em dados antigos.
Estamos corretos ao pensar que devemos fazer esse bloqueio pessimista ao atualizar, mesmo usando campos de versão / bloqueio otimista?
SELECT ... FOR UPDATE
ou bloqueio otimista por versão de linha, não por ambos. Veja os detalhes na resposta.