事务的3个重要对象:TransactionDefinition、PlatformTransactionManager、TransactionStatus
所谓的事务管理即是:“按照给定的事务规则来执行提交或回滚操作”。
TransactionDefinition:指定了事务的管理规则
PlatformTransactionManager:定义了提交和回滚操作
TransactionStatus:表示一个新的或者运行着的事务。可查询事务状态。
编程式事务管理需要显示的调用beginTransaction()、commit()、rollback()等事务管理相关的方法。
基于API的编程式事务管理:
<span style="font-size:18px;">@Resource
private UserDao userDao;
private TransactionDefinition txDefinition;
private PlatformTransactionManager txManager;
public boolean updateUser(User user){
TransactionStatus txStatus = txManager.getTransaction(txDefinition);//<span style="font-size:14px;">获取当前事物或新建一个事务</span>
boolean result = false;
try {
result = userDao.updateUser(user);
txManager.commit(txStatus); //提交
} catch (Exception e) {
result = false;
txManager.rollback(txStatus); //回滚
System.out.println("Transfer Error!");
}
return result;
}</span>
XML配置如下:
<bean id="Service" class="com.danger.superclub.service">
<property name="userDao" ref="userDao"/>
<property name="txManager" ref="transactionManager"/>
<property name="txDefinition">
<bean class="org.springframework.transaction.support.DefaultTransactionDefinition">
<property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
</property>
</bean>
基于TransationTemplate的编程式事务管理
@Resource
private UserDao userDao;
private TransactionTemplate transactionTemplate;
public boolean updateUser(final User user){
return (Boolean) transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus status) {
Object result;
try {
result = userDao.updateUser(user);
} catch (Exception e) {
status.setRollbackOnly();
result = false;
System.out.println("Transfer Error!");
}
return result;
}
});
}
XML配置如下:
<span style="font-size:14px;">//配置事务模版</span>
<bean id="transactionTemplate"
class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
</bean>
<bean id="userService" class="com.danger.superclub.service">
<property name="userDao" ref="userDao"/>
<property name="transactionTemplate" ref="transactionTemplate"/>
</bean>
TransactionTemplate 的 execute() 方法有一个 TransactionCallback 类型的参数,该接口中定义了一个 doInTransaction() 方法,通常我们以匿名内部类的方式实现 TransactionCallback 接口,并在其 doInTransaction() 方法中书写业务逻辑代码。该方法采用了默认的事务管理规则。
doInTransaction() 方法有一个TransactionStatus 类型的参数,我们可以在方法的任何位置调用该参数的setRollbackOnly() 方法将事务标识为回滚的,以执行事务回滚。
根据默认规则,如果在执行回调方法的过程中抛出了未检查异常,或者显式调用了TransacationStatus.setRollbackOnly() 方法,则回滚事务;如果事务执行完成或者抛出了 checked 类型的异常,则提交事务。