Por algum motivo comercial, estou executando a consulta SELECT * FROM table WHERE updated_at > $1 AND user_id = $2;
.
Considere duas transações, A e B, que estão atualizando linhas na tabela: UPDATE table SET value = $1, updated_at = NOW() WHERE id = $2;
. A transação A começa primeiro, portanto, a updated_at
linha de A é anterior à linha de B. updated_at
No entanto, por algum motivo, A fica mais lento e B confirma primeiro.
Se a primeira consulta for executada antes de A ser confirmado, o software exibirá a linha de B, mas não a linha de A, o que as empresas dizem não ser aceitável.
Isso poderia ser resolvido usando pg_xact_commit_timestamp()
, mas retorna quando a transação foi concluída, não confirmada (provavelmente é adequado para o meu caso de uso).
Outra solução poderia ser executar as transações SELECT FROM table WHERE user_id = $1 FOR UPDATE;
antes de atualizar a linha, mas essas consultas fazem parte de transações maiores e acho que isso destruiria o desempenho de gravação.
Uma solução simples parece fazer com que a transação B espere que A seja confirmada. Existe uma maneira de conseguir isso?