Deadlock em linhas diferentes  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
johnnylcon
Debugger
[Avatar]

Membro desde: 24/09/2007 10:16:45
Mensagens: 51
Localização: Campinas / SP
Offline

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

Johnny L. Contiero
Sami Koivu
Virtual Machine Man
[Avatar]

Membro desde: 16/09/2004 09:49:27
Mensagens: 574
Localização: Curitiba-PR
Offline

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

(Slightly) Random Broken Thoughts on Java Security
[Email] [WWW] [Yahoo!] [MSN]
Javabuntu
GUJ Master
[Avatar]

Membro desde: 08/02/2007 17:15:32
Mensagens: 1315
Localização: Brasília
Offline

johnnylcon wrote: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

SCJP 6
SCJD
SCWCD 5
Itil V2
[MSN]
johnnylcon
Debugger
[Avatar]

Membro desde: 24/09/2007 10:16:45
Mensagens: 51
Localização: Campinas / SP
Offline

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....

Johnny L. Contiero
johnnylcon
Debugger
[Avatar]

Membro desde: 24/09/2007 10:16:45
Mensagens: 51
Localização: Campinas / SP
Offline

******** 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...

Johnny L. Contiero
johnnylcon
Debugger
[Avatar]

Membro desde: 24/09/2007 10:16:45
Mensagens: 51
Localização: Campinas / SP
Offline

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.

Johnny L. Contiero
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team