| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 11:51:19
|
johnnylcon
Debugger
![[Avatar]](/images/avatar/536c5213cb6e3f546b8a5612aa104aac.jpg)
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 |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 12:12:06
|
Sami Koivu
Virtual Machine Man
![[Avatar]](/images/avatar/a4d8e2a7e0d0c102339f97716d2fdfb6.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 12:26:19
|
Javabuntu
GUJ Master
![[Avatar]](/images/avatar/00053f5e11d1fe4e49a221165b39abc9.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 13:49:42
|
johnnylcon
Debugger
![[Avatar]](/images/avatar/536c5213cb6e3f546b8a5612aa104aac.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 14:09:22
|
johnnylcon
Debugger
![[Avatar]](/images/avatar/536c5213cb6e3f546b8a5612aa104aac.jpg)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/09/2009 14:59:17
|
johnnylcon
Debugger
![[Avatar]](/images/avatar/536c5213cb6e3f546b8a5612aa104aac.jpg)
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 |
|
|
 |
|
|