Então Matheus...

Como esse MasterDetail precisa ser “exato” eu fiz FOREIGN KEY entre as tabelas 
pra não ter problemas.
Estava analisando aqui e realmente é um problema de rotina no sistema, 
onde o usuário tenta salvar uma tabela acima estando uma filha em edição, 
por isso a ambiguidade no post.

Resolvido

Valeu as dicas, é bom trocar umas ideias 


Marcelo Silva
-------------------------------------------------------------
Desenvolvedor: Delphi, PHP, ASP

Cel: (11) 95052-1407 Tim
Cel: (11) 99693-4251 Vivo
msn: [email protected]

Empresa: Perfil Medicina e Segurança do Trabalho



From: Matheus de Oliveira 
Sent: Thursday, October 25, 2012 9:11 AM
To: Comunidade PostgreSQL Brasileira 
Subject: Re: [pgbr-geral] Travamento de Registro??? (curiosidade)

2012/10/25 Marcelo Silva <[email protected]>

  Senhores aconteceu uma coisa curiosa no meu sistema e não entendi, resolvi, 
mas acho que não foi da forma correta.

  Tenho uma tela bem complexa onde faço vários “Masters Details” e vou 
inserindo sub-níveis em várias tabelas.
  Como o usuário as vezes faz uma sequencia ainda não prevista, gera uns erros 
que vamos corrigindo e tudo bem...

Dica: eu não gosto muito de documentos muito "formais", mas em casos assim um 
diagrama de sequência e até um de caso de uso ajuda bastante.
Tente também não "forçar" uma sequência exata, mas valide cada uma das etapas 
que dependem de etapas anteriores, assim você se desprende um pouco desses 
"vamos corrigindo..." (claro que não conheço bem o seu caso, então posso não 
estar falando "coisa com coisa" para tal, nem sempre dá pra generalizar).
 

  Em um dado momento ocorreu o seguinte erro:

  “0 record(s) updated. Only one record should have been updated.”

  Ao meu ver isso ocorre porque o aplicativo tentou fazer um update em mais de 
um registro ao mesmo tempo. (estranho)
  Até aí tudo bem, corrijo a rotina e bola pra frente...

Cara, eu posso estar enganado, mas isso aí não me parece erro vindo do 
PostgreSQL não, tá mais com cara de erro vindo do seu driver ou algum framework.
Qual sua linguagem? Delphi? Está usando algum tipo de ORM?

Se for mesmo erro vindo de alguma lib, tente pesquisar na documentação da mesma 
e ver o que causa o mesmo.
 

  Mas no postgres ele travou esse registro e eu não conseguia mais fazer o 
update, 

Como você chegou a essa conclusão? Digo, que ele "travou" e não que você não 
conseguia mais fazer o update.

O link [1] e [2] disponibiliza consultas que ajudam a encontrar "locks" abertos.

 

  eu tive que deletar o registro manualmente na base pra poder prosseguir.

Se ele "travar" um registro pra update por causa de um lock (que é o que o 
PostgreSQL pode fazer), o mesmo também fica "travado" para delete.

Lembre-se de que para o PostgreSQL um update é basicamente um delete seguido de 
um insert.

 
  Tentei um Vaccumn nas tabelas envolvidas mas também não deu... só excluindo o 
registro mesmo.

  Pergunta:
  Por que isso ocorre, e por que não consegui fazer o update mesmo depois de 
ter derrubado a conexão que gerou esse erro?

Registros bloqueados sem nenhuma conexão, muitas vezes é causado por "prepared 
transactions", execute a seguinte consulta e diga se há alguma:

SELECT * FROM pg_prepared_xacts;

 

  Obs.: Eu não faço nenhum travamento exclusivo no sistema de registro ou 
tabela.

E o seu framework/driver?


[1] http://wiki.postgresql.org/wiki/Lock_Monitoring
[2] http://wiki.postgresql.org/wiki/Lock_dependency_information 

Atenciosamente,

--
Matheus de Oliveira
Analista de Banco de Dados PostgreSQL
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres





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

<<wlEmoticon-smile[1].png>>

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

Responder a