Deadlock em linhas diferentes

5 respostas
johnnylcon

Bom Dia Galera,

Estou com o seguinte problema, estou fazendo um select for update em uma linha da minha tabela, com isso essa somente essa linha deveria ficar “lockada”.

Porém quando tento alterar algum registro de Outra linha na mesma tabela, tenho o problema de deadlock, dá a impressão que o lock está contecendo na tabela toda e não somente na linha.

Alguem sabe o que pode ser isso???

Valew

5 Respostas

Sami_Koivu

Olá,

Não é um assunto que eu conheço muito bem, mas pra quem conhecer, provavelmente seria util saber com qual banco você está trabalhando.

Oracle tem uns views do sistema que ajudam com esse tipo de coisa, que dizem quem é que tá com lock do que.

Eu já vi uma vez uma pagina que tinha vários selects diferentes que mostraram esse tipo de coisa. Agora só achei esse:
http://www.dba-oracle.com/t_locked_rows_user_locks.htm
Mas poderia te ajudar depurar o problema.

[]s,
Sami

Javabuntu

johnnylcon:
Bom Dia Galera,

Estou com o seguinte problema, estou fazendo um select for update em uma linha da minha tabela, com isso essa somente essa linha deveria ficar “lockada”.

Porém quando tento alterar algum registro de Outra linha na mesma tabela, tenho o problema de deadlock, dá a impressão que o lock está contecendo na tabela toda e não somente na linha.

Alguem sabe o que pode ser isso???

Valew

Isso que você citou aparentemente não é deadlock, o “abraço mortal”, “bloqueio mortal”, onde recurso A chama um recurso de B e aguarda, que por usa vez chama o recurso de A e aguarda também, ou seja, A ficará eternamente esperando B terminar, e B ficará eternamente esperando A terminar, isso é deadlock.

Quando ao seu problema não deve ser deadlock, se for, o problema está no “código” e não com o banco. Você está com problema pra acessar simultaneamente, ou é após ter bloqueado uma linha, feito o processamento, liberados os recursos e ainda sim continua bloqueado numa segunda requisição não simultânea?

Você está usando qual tipo de lock? otimista? Está usando Hibernate?

Dê mais detalhes para que possamos auxiliar.

[]'s Hewerton Crisóstomo

johnnylcon

Obrigado pelas respostas,

Primeiramente o banco esqueci de falar, é o Oracle.

Estou acessando usando jdbc mesmo, e a situação é a seguinte:

  • Eu faço um select for update em uma tabela X, enquanto uma outra thread também faz um select for update em uma outra linha dessa mesma tabela X. Então quando um dos processos tenta fazer o update, acontece o erro.

Obs.: Estou “portando” a aplicação de Postgre pra Oracle. E o Postgre cria automaticamente um índice para a chave da tabela, vocês saberiam me dizer se o Oracle também faz isso?

Valew…

johnnylcon

******** ERRATA ************

Na verdade não é na mesma tabela…

eu tenho 3 tabelas, A, B e C.

a tabela A e C fazem FK com a tabela B, na mesma coluna.

eu faço o select update na tabela A, e a outra thread faz o select update na tabela C, qdo a thread tenta finalizar o update na tabela C, acontece o erro.

não sei se a FK está interferindo nisso, se preciso criar algum tipo de índice, não sei… to perdido…

johnnylcon

Galera, descobri o problema.

quando eu fazia o update na tabela C, eu atualiza todos os campos e mesmo não alterando o meu ID eu escrevia ele de novo na tabela, com isso o banco entende que houve alteração no id, e por isso ele precisava validar as FK.

 Então ele "lockava" a tabela C para validar o ID, a tabela B e outras tabelas que também tinha FK com a tabela B.

 Como não vou alterar o ID, eu escreve todos os campos menos o ID, com isso não é necessário validar as FK.

 Agradeço a todos pela ajuda.
Criado 3 de setembro de 2009
Ultima resposta 3 de set. de 2009
Respostas 5
Participantes 3