Problemas com Controle de Transação com EJB Session Bean

Estou tendo um problema com transações controladas pelo container EJB (JBoss 4.0.4SP1).
Tenho dois métodos, metodoA e metodoB que são métodos de um mesmo Session Bean Stateless.
O metodoA executa várias operações em um SGDB e chama diversas vezes o metodoB
que tbém executa várias operações em um SGDB.
O comportamento que eu espero deste processo é que o controle de transação do metodoB seja independente do
metodoA, ou seja, quando metodoB finalizar seja feito um commit ou se exceção rollback (nas operações do metodoB).
O mesmo para o metodoA, se sucesso commit, se exceção rollback (nas operações do metodoA).

Abaixo segue um esquema de chamadas que realizo.
A transação do metodoA está configurado (ejb-jar.xml) como Required e do metodoB como RequiresNew.
Aparentemente na primeira chamada do metodoB é criada uma nova transação,
porém nas próximas chamadas do metodoB se exceção não é feito o rollback.

  • Já tentei outras combinações de transações como Never com RequiresNew e Never com Required com nenhuma obtive sucesso.
  • Os métodos são ambos chamados via interface remota.
  • A persistência é feita com JDBC.

Se alguém tiver alguma idéia do que pode estar errado eu agradeço.

metodoA
|
|  insert update delete
|
|  Loop
|    metodoB
|  fim Loop 
|
|  insert update delete
|
fim metodoA

metodoB
|
|  insert update delete etc
|
fim metodoB
 <container-transaction>
      <method>
        <ejb-name>SessionBean</ejb-name>
        <method-name>metodoA</method-name>
        <method-params>
          <method-param>java.util.List</method-param>
        </method-params>
      </method>
      <trans-attribute>Required</trans-attribute>
</container-transaction>

 <container-transaction>
      <method>
        <ejb-name>SessionBean</ejb-name>
        <method-name>metodoB</method-name>
        <method-params>
          <method-param>java.lang.String</method-param>
        </method-params>
      </method>
      <trans-attribute>RequiresNew</trans-attribute>
</container-transaction>

Já tentou usar CMP?

As said:

http://edocs.bea.com/wls/docs70/faq/ejb.html

"Q. How should I obtain my JDBC connection so that it participates in the EJB container’s transaction?

A. You must get your JDBC connection from a TxDataSource or from the JTS driver. If you get a JDBC connections from a plain DataSource or directly from the JDBC driver, it will NOT participate in the EJB container transaction.
"

:wink:

Não tentei…porém isto no momento esta fora de cogitação…

Taz,

As operações que realizo estão sim em um contexto transacional do container…pois em operações onde metodoX chama metodoY que chama metodoZ que chama metodoW, se metodoW der erro o container está efetuando o rollback…onde o metodoX iniciou a transação…

O problema está na cituação descrita na primeira msg, na utilização do RequiresNew. Quero que sejam criadas transações independentes.

Grato

Amigo, coloque a transação do metodo A como RequiredNew e do metodo B como Required, assim quando o metodo A eh chamado criara uma nova transação e o metodo B utilizará a mesma transação, lembre-se de dar um setRollbackOnly() no catch da sua SQLException.

Qual app server vc usa?

[editado] Ok. Jboss.

Não tentei…porém isto no momento esta fora de cogitação…
[/quote]

Vc sabe o que é CMP? Pq está fora de cogitação? Se não quiser abrir mão do CMT, vai ter que abrir mão do JDBC…