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事务失效常见场景

Spring入门教程:@Transactional事务失效常见场景

在 EJB 中添加隔离级别

从阿里规约看Spring事务

java ee EJB中的服务层和dao层