- EJB 教程
- EJB - 主页
- EJB - 概述
- EJB - 环境设置
- EJB - 创建应用程序
- EJB - 无状态Bean
- EJB - 有状态Bean
- EJB - 持久性
- EJB - 消息驱动Bean
- EJB - 注解
- EJB - 回调
- EJB - 定时器服务
- EJB - 依赖注入
- EJB - 拦截器
- EJB - 可嵌入对象
- EJB - 大对象/字符大对象
- EJB - 事务
- EJB - 安全性
- EJB - JNDI 绑定
- EJB - 实体关系
- EJB - 访问数据库
- EJB - 查询语言
- EJB - 异常处理
- EJB - Web 服务
- EJB - 打包应用程序
- EJB 有用资源
- EJB - 快速指南
- EJB - 有用资源
- EJB - 讨论
EJB - 事务
事务是单个工作单元,遵循ACID属性。ACID代表原子性、一致性、隔离性和持久性。
原子性 - 如果任何工作单元失败,则整个单元将被视为失败。成功意味着所有项目都成功执行。
一致性 - 事务必须保持系统的状态一致。
隔离性 - 每个事务独立于任何其他事务执行。
持久性 - 如果事务已执行或提交,则事务应能够在系统故障中幸存。
EJB容器/服务器是事务服务器,处理事务上下文传播和分布式事务。事务可以由容器管理,也可以由bean代码中的自定义代码处理。
容器管理的事务 - 在这种类型中,容器管理事务状态。
Bean管理的事务 - 在这种类型中,开发人员管理事务状态的生命周期。
容器管理的事务
EJB 3.0指定了以下事务属性,EJB容器实现这些属性:
REQUIRED - 指示业务方法必须在事务中执行,否则将为该方法启动一个新事务。
REQUIRES_NEW - 指示要为业务方法启动一个新事务。
SUPPORTS - 指示业务方法将作为事务的一部分执行。
NOT_SUPPORTED - 指示业务方法不应作为事务的一部分执行。
MANDATORY - 指示业务方法将作为事务的一部分执行,否则将抛出异常。
NEVER - 指示如果业务方法作为事务的一部分执行,则将抛出异常。
示例
package com.tutorialspoint.txn.required; import javax.ejb.* @Stateless @TransactionManagement(TransactionManagementType.CONTAINER) public class UserDetailBean implements UserDetailRemote { private UserDetail; @TransactionAttribute(TransactionAttributeType.REQUIRED) public void createUserDetail() { //create user details object } }
使用Required注解将createUserDetail()业务方法设置为Required。
package com.tutorialspoint.txn.required; import javax.ejb.* @Stateless public class UserSessionBean implements UserRemote { private User; @EJB private UserDetailRemote userDetail; public void createUser() { //create user //... //create user details userDetail.createUserDetail(); } }
createUser()业务方法使用createUserDetail()。如果在createUser()调用期间发生异常并且未创建User对象,则也不会创建UserDetail对象。
Bean管理的事务
在Bean管理的事务中,可以通过在应用程序级别处理异常来管理事务。
以下是要考虑的关键点:
启动 - 何时在业务方法中启动事务。
成功 - 确定事务要提交的成功场景。
失败 - 确定事务要回滚的失败场景。
示例
package com.tutorialspoint.txn.bmt; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.ejb.TransactionManagement; import javax.ejb.TransactionManagementType; import javax.transaction.UserTransaction; @Stateless @TransactionManagement(value=TransactionManagementType.BEAN) public class AccountBean implements AccountBeanLocal { @Resource private UserTransaction userTransaction; public void transferFund(Account fromAccount, double fund , Account toAccount) throws Exception{ try{ userTransaction.begin(); confirmAccountDetail(fromAccount); withdrawAmount(fromAccount,fund); confirmAccountDetail(toAccount); depositAmount(toAccount,fund); userTransaction.commit(); }catch (InvalidAccountException exception) { userTransaction.rollback(); }catch (InsufficientFundException exception) { userTransaction.rollback(); }catch (PaymentException exception) { userTransaction.rollback(); } } private void confirmAccountDetail(Account account) throws InvalidAccountException { } private void withdrawAmount() throws InsufficientFundException { } private void depositAmount() throws PaymentException{ } }
在此示例中,我们使用UserTransaction接口使用userTransaction.begin()方法调用来标记事务的开始。我们使用userTransaction.commit()方法标记事务的完成,如果事务期间发生任何异常,则我们使用userTransaction.rollback()方法调用回滚整个事务。