Em 08-09-2015 21:59, Eurides Baptistella escreveu:

(...)

Agora, em uma transação isolada: inserir um novo registro de histórico
para o produto 1
begin;
insert into tb_produtoestoquehistorico values (null, 1, 1,
CURRENT_TIMESTAMP, null);

Mantendo a transação anterior aberta (utilizando outro terminal), em
uma nova transação atualizar o estoque do produto 1:
begin;
update tb_produtoestoque set
        qt_estoque = qt_estoque + coalesce((select sum(t1.qt_estoquehistorico)
                                                                  from
tb_produtoestoquehistorico t1
                                                                where
t1.produtoestoque_id = tb_produtoestoque.id
                                                                   and
t1.dt_processamento is null), 0)
  where id in (select t1.produtoestoque_id
                      from tb_produtoestoquehistorico t1
                    where t1.dt_processamento is null);

Percebam que o update ficou aguardando a primeira transação.
Porque o update na tabela produtoestoque é mantido em waiting?
Porque a trigger manteve o lock (ExclusiveLock) sobre a tabela de histórico?

Não é a trigger que causa nada, é um lock normal. Você fez um update na primeira transação, isso bloqueia a linha para outras alterações. O bloqueio só é liberado no commit. Isso é parte do que chamamos de ACID - a primeira letra, atomicidade, uma operação é válida no momento de sua confirmação (commit) imediatamente, sendo que a letra I - independência, obriga que uma transação náo interfira na outra, logo, a segunda transação vai esperar a primeira terminar para que possa modificar a mesma linha.

Utilizo PostgreSQL 9.2.4

Nada a ver com sua dúvida, mas você deve atualizar sua versão para 9.2.13 com urgência, você corre riscos desnecessários.

[]s
Flavio Gurgel
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a