事务是一个单元的工作项目遵循ACID特性。ACID代表原子性,一致性,独立性和持久性。
-
原子 -如果有任何的工作项失败,完整的单元被认为是失败。成功意味着所有项目的成功执行。
-
一致性- 事务必须保持系统处于一致状态。
-
独立性- 每个事务执行独立的任何其他的事务。
-
持久性 - 事务应该生存系统故障,如果已经执行或提交。
EJB容器/服务器,的事务服务器和处理事务上下文的传递和分布式事务。事务可以由容器管理或bean的代码自定义代码处理。
-
Container Managed Transactions - 在这种类型中,容器管理的事务状态。
-
Bean Managed Transactions - 在这种类型中,开发者管理事务状态的生命周期。
指定EJB3.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
}
}
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(期间发生的异常)调用和用户对象不会创建那么UserDetail对象也不会被创建。
Bean管理的事务,事务处理应用水平的异常,可以管理。以下是要考虑的关键点
-
Start - 当启动一个事务中的业务方法。
-
Sucess - 确定成功的情况下,当一个事务被提交。
-
Failed - 确定失败的情况下,事务回滚。
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()方法调用。