Eu tenho uma série de instruções SQL que se parecem com o seguinte:
BEGIN;
SELECT counter FROM table WHERE id=X FOR UPDATE;
REALLY COMPLEX QUERY;
UPDATE table SET counter=Y WHERE id=X;
END;
Eu gostaria de impedir que o contador fosse lido enquanto recalculava seu valor, mas de acordo com os documentos do Postgres "Os bloqueios no nível da linha não afetam a consulta de dados; eles bloqueiam apenas gravadores na mesma linha".
Questões:
- Qual o sentido de um bloqueio de linha "exclusivo" se não impedir leituras? É apenas para impedir que outras transações recebam bloqueios de compartilhamento?
- Se eu ler a linha com SELECT ... FOR SHARE, isso atinge o mesmo efeito que um bloqueio "exclusivo"?
- É possível desativar o MVCC para uma tabela / esquema / banco de dados e permitir gravações no local?
fonte