Funcionamento da JTA + Timeout da Transacao - [RESOLVIDO]

Prezados

Estou com algumas duvidas em Relacao a JTA e por mais que tenha lido, acho que algo me escapou…

Pelo que entendi, a JTA ira Gerenciar suas transacoes, no lugar do banco de dados, ou seja, a partir de agora vc tem uma interface Java que gerencia Commit, rollbacks e cria novas Transactions…

Pois bem, aqui estamos com um probleminha um pouco maior que isso. Usamos o OAS + Oracle e configuramos a JTA… So que o sistema possui a maioria (90%) das regras no BD (SPs e Functions) e somente 10% na Aplicacao…

Recentemente, nosso tempo de Timeout da JTA estava setado em 90 segundos, quando chamavamos uma SP de geracao de um arquivo que demorava um pouquinho mais, dava JTATransactionException devido ao estouro do Timeout… pois bem, como sou um reles programador e nunca tive a necessidade de configurar um AS com tanta precisao assim, comecei a fucar bem devagar sobre a JTA…

Como usamos o Hibernate e algumas (BBBEEEEEMMMMMMMMM POUQUISSIMAS) operacoes sao realizadas com os metodos do DaoGenerico (Save, Update, Delete), me surgiu uma confusao em relacao ao impacto… Pra resolver o problema do Timeout, aumentamos o tempo da transacao de 90 pra 300 segundos (5 min.) a SP funcionou legal, porem minha preocupacao sao com as demais transacoes daqui pra frente. Somente depois de 300 segundos, todas as transacoes que tiverem dependendo de um Commit sofrerao esse commit ?? ou para cada nova DML a JTA vai criar uma nova transacao pra mim e assim nenhuma afeta a outra ???

Porque se isso acontecer:

Nao e interessante pra mim, preciso que as demais nao sejam afetadas pelo erro do Passo 4.

Ja se ele abrir uma Transacao por cada uma das chamadas, cada uma demorando 5 minutos pra me dar o commit, eh menos ruim, mas ainda acho que nao e a melhor solucao…

E ai ?? algum amigo que possa ajudar ?? estou enganado com algum conceito ?? eh isso mesmo ?? algum Help pra resolver a minha bronca ??

PS: em nossos DataSources, pra cada contexto de banco, temos a propriedade tx-level definida assim:

Valews

Sua resposta: depende. A JTA possui vários tipos de ajuste de transação, e você tem maneiras de colocar transações encadeadas. Mas, é fato, uma mesma transação vai correr até o final com esse tempo e, se durante esse tempo ela não terminar, vai sofrer rollback. Sua lógica, portanto, está correta. Dê uma procurada no Google pelos tipos de transação (MANDATORY, NOT_SUPPORTED, SUPPORTS, NEVER, REQUIRED, REQUIRES_NEW) pra entender melhor como esse tipo de transação funciona.

[]´s

Fala Cara… valew pela resposta… entao todos os passos descritos no meu exemplo sofreriam RollBack ???

Vou dar uma pesquisada nos tipos de Transacao e em breve posto aqui o resultado do que ficou decidido…

Att.

Prezados,

vasculhando o projeto (assumi a manutencao e termino somente) verifiquei que os colegas do projeto utilizam uma anotacao do Spring @Transactional e que essa anotacao tem uma propriedade “timeout”.

Andei lendo alguns artigos a respeito dessa Anotacao, e na documentacao a descricao da Propriedade timeout diz o seguinte:

Serah que achei minha solucao ?? essa anotacao faria com que somente meu metodo que chama a Procedure tivesse um tempo de Transacao alto, deixando as demais Transacoes do Sistema com o tempo de Timeout definido pelo Server ?? :?:

Att.

Isso nao esta correto :slight_smile: JTA nao substitui as transacoes do banco de dados. Dependendo do suporte do seu banco de dados, ele pode ser configurado para “se juntar” a uma transacao JTA, mas um nao substitui o outro. Entao, a transacao do banco pode continuar existindo, mas o resultado desta transacao afeta a transacao JTA. Se o 2-Phase commit estiver habilitado, uma falha ocorrida depois das atividades no banco de dados pode fazer com que a transacao no banco de dados sofra um rollback.

Ao contrario: somente as transacoes que NAO tiverem sido efetuadas com sucesso (commit) serao canceladas (rollback). Entenda o timeout como “tempo maximo para dar commit final” :slight_smile:

Quem coordena as transacoes eh vc. Se voce usa EJBs, por exemplo, cada metodo de negocio do seu EJB pode ser marcado como transacional, e o Application Server (se configurado corretamente) vai coordenar a transacao de forma transparente. Mas a ideia eh que ele vai deduzir que vc quer uma transacao por “operacao de negocio”. Mas no fim, eh vc quem coordena cada transacao. Entao, se vc executar uma DML como parte de uma transacao e outra DML em outra transacao, as duas sao independentes. Claro que se uma alterar dados a ponto de deixar a outra invalida, uma vai falhar. Mas imagino que seja isso o que vc quer :slight_smile:

E imagino que voce possa sim executar os passos 1 a 3 como parte de “Transacao1” e o passo 4 como parte da “Transacao 2”. Assim, se Transacao2 falhar, nao afeta a Transacao1.

Este documento talvez te ajude (mesmo vc nao usando JBoss AS): http://docs.jboss.org/jbossas/admindevel326/html/ch4.chapt.html

Fala cara… Valew mesmo… sua explicacao me facilitou muita coisa…

Como estava usando o OC4JTrasnsactionManager para gerenciar minhas Transacoes, esse problema tava me dando dor de cabeca…

O que eu coloquei acima de fato estava acontecendo… tinha a Transacao sendo controlada por metodo de negocio com a anotacao @Transactional

De fato, essa anotacao salvou a vida… com a Propriedade Timeout eu consegui fzer com que somente meu metodo unico tivesse o tempo de Transacao aumentado sem mexer na configuracao do Server…

Valew pela ajuda de Todos…