📅  最后修改于: 2020-11-16 06:23:46             🧑  作者: Mango
事务是工作项的单个单元,遵循ACID属性。 ACID表示原子,一致,隔离和持久。
原子-如果任何工作项失败,则整个单元将被视为失败。成功意味着所有项目都成功执行。
一致-事务必须使系统保持一致状态。
隔离-每个事务独立于任何其他事务执行。
持久-如果事务已执行或提交,则事务应在系统故障后幸免。
EJB容器/服务器是事务服务器,并处理事务上下文传播和分布式事务。事务可以通过容器或bean代码中的自定义代码处理来管理。
容器管理的事务-在这种类型中,容器管理事务状态。
Bean管理的事务-在这种类型中,开发人员管理事务状态的生命周期。
EJB 3.0指定了以下事务属性,EJB容器实现了以下属性:
必需-指示必须在事务内执行业务方法,否则将为该方法启动新事务。
REQUIRES_NEW-指示要为业务方法启动新事务。
支持-表示业务方法将作为事务的一部分执行。
NOT_SUPPORTED-指示不应将业务方法作为事务的一部分执行。
强制-表示业务方法将作为事务的一部分执行,否则将引发异常。
永不-指示业务方法是否作为事务的一部分执行,则将引发异常。
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管理的事务中,可以通过在应用程序级别处理异常来管理事务。
以下是要考虑的关键点-
开始-何时以业务方法开始交易。
Sucess -确定成功场景时,交易将被提交。
失败-确定要回滚事务时的失败情况。
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()方法调用回滚整个事务。