对应ejb,默认是对整个类使用事务。所以所有方法都开启事务。
而对于用TransactionAttribute注释来引用容器管理的事务,只能在第一级的方法中使用。对应类中的方法再调用其它类中方法,注释事务就不起作用了。
代码示例如下:
在一个没有事务的类中调用:
@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)
@Stateless
public class MyTask{
@Inject Task t;
t.doTask();
}
@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)
@Stateless
public class Task {
public void doTask(){
job();
}
@TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRED)
public void job(){
//db insert operation ....
}
}
这个调用将会抛出:
ERROR [org.jboss.as.ejb3.invocation] (Batch Thread - 9) WFLYEJB0034: EJB Invocation failed on component PeekCompute for method public void com.italktv.colnv.stat.task.PeekCompute.start(java.lang.String): javax.ejb.EJBException: javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInNoTx(CMTTxInterceptor.java:213)
但是,如果MyTask里面直接调用 t.job(),那么是成功的。