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.