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.