zoukankan      html  css  js  c++  java
  • 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(),那么是成功的。

  • 相关阅读:
    浏览器窗口的尺寸和大小
    Oracle
    Maven
    框架使用xm配置文件中文件头信息
    Oracle SQL Developer 安装
    Jquery函数的几种写法
    spring boot拦截器配置
    java之大文件断点续传
    idea打jar包经验总结
    oracle模糊搜索避免使用like,替换为instr()
  • 原文地址:https://www.cnblogs.com/bigben0123/p/7133339.html
Copyright © 2011-2022 走看看