昨天改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内所做的数据库操作进行两阶段端提交。
大致如下
相关推荐
为了确保在分布式环境中事务的一致性和完整性,通常采用**两阶段提交协议(2PC,Two-Phase Commit)**来管理这些事务。 ##### 两阶段提交协议的基本原理 - **第一阶段:准备阶段(Prepare Phase)** - 事务协调器...
1. **事务管理**:容器自动管理事务的开始、提交、回滚和传播规则。 2. **安全**:容器提供身份验证和授权,确保只有授权的用户才能访问Bean。 3. **并发控制**:对于有状态会话Bean,容器会处理多个客户端并发...
6. **容器管理事务**:EJB3.0提供了一种声明式事务管理方式,开发者只需在接口或方法上添加事务属性,由容器自动处理事务的开始、提交、回滚等操作。 7. **安全性**:EJB3.0集成了JAAS(Java Authentication and ...
- JTA规范要求资源管理器支持两阶段提交协议(2PC),以确保事务的原子性和一致性。这意味着资源管理器必须能够在事务最终提交之前准备好提交或回滚事务的状态。 3. **性能优化**: - 由于分布式事务涉及多个资源...
- **XAResource**:由资源管理器实现,提供与事务管理器交互的接口,用于支持两阶段提交等分布式事务协议。 #### 实现考量与应用场景 JTA规范不仅提供了接口定义,还详细阐述了在组件化企业应用服务器环境中实现...
4. **EJB的事务管理**:EJB容器提供了事务支持,可以自动管理事务的开始、提交、回滚。开发者可以声明事务的传播行为和隔离级别。 5. **EJB的安全性**:EJB允许设置角色和权限,控制谁可以访问哪些Bean方法。这通常...
它实现了两阶段提交协议(2PC),以确保跨多个资源的一致性。 在描述中提到的"michael_jta_code"可能包含以下示例: - **分布式事务示例**:展示如何在一个事务中同时更新两个不同的数据源,如两个不同的数据库。 ...
- XAResource:表示可以参与事务的资源,如数据库连接,它实现了两阶段提交协议以确保跨多个系统的事务一致性。 Java Transaction Service (JTS) 是JTA的实现,它是Java EE的一部分,提供了完整的事务管理服务,...
在J2EE环境中,容器负责事务的开始、提交、回滚和传播,确保操作的原子性和一致性。 此外,J2EE还强调了安全性、可移植性和可扩展性。例如,通过JAAS(Java Authentication and Authorization Service)进行用户...
- 事务传播行为:事务传播特性在多层系统中的应用。 6. **面向对象设计**: - 面向对象原则:单一职责原则、开闭原则等基本原则。 - 设计模式选择:根据实际需求选择合适的设计模式。 通过以上知识点的学习与...