昨天改EJB程序时出现了一个bug,服务器报了一个transaction does not exist,研究了大半天,终于发现原来是因为我的两个事物同时修改一条记录,weblogic两阶段提交时产生的问题,先上代码(示例,不是真实那个啊):
第一个接口:
@Stateless @Remote( { ARmote.class }) public class ABean implements ARmote{ @EJB private ARmote aRmote; @EJB private BRmote bRmote; public void invoke(DTO dto){ bRmote.update(dto); aRmote.update(dto); } @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public int update(DTO dto){ return dao.update(dto); } }
第二个接口:
@Stateless @Remote( { BRmote.class }) public class BBean implements BRmote{ public int update(DTO dto){ return dao.update(dto); } }
第一个接口和第二个接口分别改同一个表中不同的字段,当我调用ARemote的invoke方法时报错(别问问啥这么写,需求)。
原因是:当程序执行到BRemote的update方法时,由于使用的是默认的事物级别(required),因此会加入ARemote的事物中,BRemote的update方法执行完毕后,weblogic会执行第一阶段提交;然后程序继续执行到aRmote.update(dto);这行时,又新起了一个事物,去操作刚刚修改的记录,导致oracle报错。
后来将aRmote.update(dto);这行挪到BRemote的update方法中,虽然修改的也是这条记录,但程序不会出现问题。
分析后得出如下结论:
假设方法A内调用方法B,方法B内调用方法C,假设A、B使用REQUIRED级别、C使用REQUIRES_NEW级别的事物,这时,方法A、B在事物1中进行,方法C在事物2中进行,那么事物的出栈顺序为:
1、执行方法C之前,方法B内所做的数据库操作不进行提交。
2、方法C执行完毕后,事物2两阶段全部提交。
3、方法B执行完毕后,方法B内所做的数据库操作进行第一阶段提交。
4、方法A执行完毕后,方法A、B内所做的数据库操作进行两阶段端提交。
大致如下
相关推荐
EJB与事务-详细描述EJB和事务,是javaEE初学者的好材料
ejb3事务分容器管理事务(CMT)和Bean管理事务(BMT),这里讲述了CMT情况下,两阶段提交例子(tow-phase commit),展示ejb容器为我们做的事情,其实就是ejb容器提供商,已经帮开发者解决了的问题。数据库分别是oracle...
关于ejb3.0 分布式事务的demo,涉及到相关persistence.xml 配置以及数据源配置。
EJB 具有事务的处理属性
实战EJB 实战EJB 实战EJB 电子书 pdf
EJB方面EJB方面EJB方面EJB方面EJB方面
j2ee1.3中实体Bean与之附带的数据库之间实现事务处理!
EJB集群资料EJB集群资料EJB集群资料EJB集群资料
传播智客EJB01jar包,已经部署成功,经过实践检验,可直接拿来使用
ejb-3_0-fr-spec-ejbcore.pdf ejb-3_0-fr-spec-persistence.pdf ejb-3_0-fr-spec-simplified.pdf
该资源是下面帖子的资料,可以进去看看帖子再下载,这样能防止下的东西没用。。。。 http://blog.csdn.net/qzh3578/article/details/46489747
java反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJBjava反射与EJB
ejb+hibernate资料 ejb+hibernate资料 ejb+hibernate资料 ejb+hibernate资料
ejb3中文版
手动部署EJB 亲自体验EJB开发流程 手动部署EJB 亲自体验EJB开发流程
本书不仅是高级设计模式的最佳指志,而且解决了EJB实现的关键问题。本书包括了多个高级EJB设计模式,还提供了使用EJB设计模式的策略、J2EE开发的最佳实例,以及非常实用的EJB设计技巧和技术。本书还包括以下内容:...
EJB3.0规范 EJB3.0 SPECIFICATION 官方规范英文版
内容依次包含了Java EE概述、EJB基础、搭建EJB环境、会话bean、持久化实体、持久化实体管理器、对象关系映射、JPQL查询、消息驱动bean、事务、提高EJB 3.0性能、从Web层访问EJB 3和EJB安全、EJB和Web服务及EJB表现层...
EJB基础学习EJB者必看里面详细记录了EJB技术等
你会深入地了解EJB体系结构、会话、实体和消息驱动bean的生命周期、CMP、EJBQL、事务、安全、模式等等内容,还会知道基于组件的开发究竟是什么意思。你理解得越多,需要记的就越少,所以不要指望一点都不懂,通过死...