Você precisa adicionar um índice no
id
coluna para garantir que você obtenha um bloqueio em nível de linha. SELECT ... FOR UPDATE
bloqueia todas as linhas que são lidas para realizar a consulta, não apenas as linhas que estão realmente selecionadas. Sem um índice, ele precisa realizar uma verificação completa da tabela, portanto, cada linha é bloqueada como resultado. Com um índice, ele apenas coloca um bloqueio nessa entrada de índice, ele não precisa ler nenhuma outra linha, portanto, nenhuma outra linha será bloqueada.