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