coderatchet
coderatchet

Reputation: 8420

EJB 3, Transaction flow in same bean

If i have two methods inside an EJB bean, one with Transaction attribute of NOT_SUPPORTED that needs to call the other with REQUIRED, can i expect the transaction to kick in if i make the call through an injected bean:

@Stateless
@LocalBean
public class LeBean {

    @EJB LeBean bean;

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void someMethod(){
        ...
        bean.otherMethod();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void otherMethd(){
        ...
    }
}

or can i make the call locally like so:

@Stateless
@LocalBean
public class LeBean {

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public void someMethod(){
        ...
        otherMethod();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void otherMethd(){
        ...
    }
}

right now someMethod() takes a long time to process information before reaching otherMethod() and so the transaction times out, even though i have stated NOT_SUPPORTED as the transactionAttribute for the first method.

Upvotes: 1

Views: 963

Answers (1)

user4903
user4903

Reputation:

can i expect the transaction to kick in if i make the call through an injected bean:

You HAVE to make the call through the injected bean if you want a transaction. The calls have to be made through the business interface, or else your transaction attribute will be ignored. In your case if you call otherMethod() from a method that has no transaction, or a suspended transaction (i.e. - NOT_SUPPORTED) then it is simply a POJO call.

Technically speaking otherMethod() will "ride on top of" the transaction of someMethod() if one did exist. For example you have NOT_SUPPORTED for someMethod(), but if it were REQUIRED or REQUIRES_NEW, then otherMethod() would share in that transaction. A rollback for someMethod() would also rollback operations from otherMethod().

right now someMethod() takes a long time to process information before reaching otherMethod() and so the transaction times out

That is a different issue altogether. You may wish to increase your transaction timeout, and consider running this as a separate asynchronous process.

Upvotes: 2

Related Questions