1 Reply Latest reply on Dec 11, 2008 5:32 AM by charl fasching

    EJB 3 + transaction propagation

    David Ford Newbie

      Hi ,

      I am stuck in an issue and need your help on it.

      I have an ejb (Bean1) where in a transaction is started.
      From this ejb (Bean1) if I call another ejb(Bean2), and anything wrong happens in Bean2, whole of the transaction is rolled back.
      This is controlled by the Jboss.

      My query is..
      If from Bean1, I make a call to some utility class which makes entires into DB and if an error happens in Bean1 , after utility class commits the DB changes. How can I rollback the changes made in utility class.

      In short, how is the transaction in EJB3 propagated to utility class?

      I am using hibernate in utility class and the application server used is JBoss4.

      I set hibernate.transaction.manager_lookup_class
      and set hibernate.transaction.factory_class to org.hibernate.transaction.JTATransactionFactory

      My code in utility class..

      UserTransaction tx = (UserTransaction)new InitialContext()

      try {

      // Do some work
      saved object using hibernate session

      catch (RuntimeException e) {
      throw e; // or display error message

      The logs show issue with tx.begin(); statement..

      at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.begin(BaseTransaction.java:79)

      and on the screen I get error
      java.lang.IllegalStateException: Wrong tx on thread: expected TransactionImple < ac, BasicAction: -3f5702b4:390d:474aea8d:77 status: ActionStatus.ABORTED >, actual null
      at org.jboss.aspects.tx.TxPolicy.endTransaction(TxPolicy.java:162)
      at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:87)

      Can you please tell what could be the problem?

      Any help will be greatly appreciated.



        • 1. Re: EJB 3 + transaction propagation
          charl fasching Newbie

          Hey all,

          I also got this error when using the TransactionManager, which is about the same as the UserTransaction.

          The problem was that I was using the the TM while it was still busy with another transaction, you have to check the status of the TM first. heres how I fixed it.

          EntityManager EM = EMF.createEntityManager();
          TransactionManager TM = (TransactionManager)ctx.lookup("java:TransactionManager");
          boolean suspended = false;
          Transaction t = null;
          if(TM.getStatus() == Status.STATUS_NO_TRANSACTION || TM.getStatus() == Status.STATUS_UNKNOWN)
          if(TM.getStatus() == Status.STATUS_ACTIVE)
           suspended = true;
           t = TM.suspend();
           throw new Exception("Transaction status invalid: "+TM.getStatus());
          //Do Actual Work with DB
          if(suspended == true)
          TM = null;
          EM = null;