Transactional ejb 事务陷阱
Posted Bigben
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Transactional ejb 事务陷阱相关的知识,希望对你有一定的参考价值。
对应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(),那么是成功的。
以上是关于Transactional ejb 事务陷阱的主要内容,如果未能解决你的问题,请参考以下文章
Spring入门教程:@Transactional事务失效常见场景
Spring入门教程:@Transactional事务失效常见场景