[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico]
[Índice de assunto]
Re: TxManager do JBoss nao suporta criacao de nova Transacao pelamesma Thread, nem propagacao de Transacao por Threads diferentes
- Subject: Re: TxManager do JBoss nao suporta criacao de nova Transacao pelamesma Thread, nem propagacao de Transacao por Threads diferentes
- From: Paulo Silveira <paulo@xxxxxxxxxxxx>
- Date: Sun, 16 Nov 2003 03:54:56 -0200
Oi professor!
Francisco Reverbel wrote:
>
> Pelo jeito vocês deixaram de dar um TxManager.suspend() dentro do método
> create() do TransactionFactory. O create() deve criar uma transação *sem*
> deixá-la associada com a thread chamadora. Como o TxManager.begin() deixa
> a transação associada com a thread chamadora, é preciso dar um suspend()
> logo depois.
Utilizei do suspend(), e ai quando eu dou um begin, e crio outra thread
para dar begin, da um deadlock logo quando essa segunda Thread executa
sua primeira requisicao (a chamada fica parada quando o servente do ejb
object passa a bola para o mbean responsavel por tratar as invocacoes
normais).
Tentei tambem dar um resume(transaction) antes de passar a chamada, mas
sem sucesso. Deadlock no mesmo momento e a transacao da timeout muito
tempo depois.
Tentei fazer o uso o disassociateThread() no begin da transacao, tambem
sem sucesso.
Fui entao tentar ver o que poderia estar dando o deadlock exatamente.
Fui no ContainerMBean correspondente, no nosso caso o
StatelessContainer, que tem o metodo invokeInternal chamado pela classe
abstrata Container. La, por sua vez, a chamada eh jogada para o primeiro
interceptor da cadeia registrada no jboss-blahblah-default.xml.
Ai suspeitei do TxInterceptorCMT, ateh achei um comentario interessante
// Thread arriving must be clean (jboss doesn't set the thread
// previously). However optimized calls come with associated
// thread for example. We suspend the thread association here, and
// resume in the finally block of the following try.
Entao ele ja cuidava do caso da thread estar associada sem problemas!
No desespero, liguei o trace do JBoss e o ultimo log dele eh do
EntityLockInterceptor:
03:46:57,445 TRACE [EntityLockInterceptor] Begin invoke, key=Paulo Silveira
Ai fui ver esse interceptor e percebi o problema. Eu tenho duas
transacoes mexendo na _mesma_ instancia de entidade. E como eu falei pra
transacao T1 fazer join com a T2, a T1 pegou o Lock1, e a T2 vai ficar
eternamente esperando pelo que o lock da T1 seja liberado, porem a T1
esta esperando pela T2 terminar... deadlock.
Se eu mexo em duas entidades diferentes, com duas threads diferentes,
rola sem problemas! Ou entao se eu nao faco o thread.join(), nao ocorre
o deadlock (ja que a primeira transacao consegue terminar e liberar o
beanlock para a segunda).
entao acho que foi apenas uma confusao, esta tudo funcionando como
deveria.... mas foi legal ter debugado.
paulo
>
> Veja no método begin() em
>
> server/src/main/org/jboss/tm/usertx/server/UserTransactionSessionImpl.java.
>
> A classe org.jboss.tm.usertx.server.UserTransactionSessionImpl faz para
> JRMP uma parte do que vocês estão fazendo para IIOP.
>
> Reverbel
>
>
>