[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




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