逻辑上的一组操作-,组成这组事务的各个单元,要么全部成功,要么全部失败
事务的特性(ACID)
事务的并发引发的问题
PlateformTransactionManager
PlateformTransactionManager
是一个接口
TransactionDefinition
TransactionStatus
用于记录事务在执行过程中,事务的状态的对象
事务管理器
更具事务定义
来管理事务,在管理过程中产生事务状态
事务的传播行为主要用来解决业务层方法相互调用的问题
Spring提供了七中的事务传播行为
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管理模板,简化事务控制 -->
<bean name="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
<!-- 配置AccountService -->
<bean name="accountService" class="com.ranger.spring.tx.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
@Override
public void transfer(Integer from, Integer to, double money) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus arg0) {
accountDao.increaseMoney(to, money);
// 开启 / 关闭 异常
int i = 1/0;
accountDao.decreaseMoney(from, money);
}
});
}
不必再业务层添加事务管理代码
配置事务管理器
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
配置事务管理通知
<!-- 配置通知(增强) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager" >
<tx:attributes>
<!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="find*" read-only="true"/> -->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
织入
<!-- 织入(完成对目标对象的代理) -->
<aop:config>
<aop:pointcut expression="execution(* com.ranger.spring.tx.service.impl.AccountServiceImpl.transfer(..))" id="transferPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="transferPointCut"/>
</aop:config>
只需配置相应bean 和开启注解,配置注解
配置事务管理器
<!-- 配置事务管理器 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
配置文件中开启事务注解、
<!-- 开启事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
类上配置注解
@Transactional(isolation=Isolation.DEFAULT)
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
private TransactionTemplate transactionTemplate;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
@Override
public void transfer(Integer from, Integer to, double money) {
accountDao.increaseMoney(to, money);
// 开启 / 关闭 异常
int i = 1/0;
accountDao.decreaseMoney(from, money);
}
}
原文:https://www.cnblogs.com/watertreestar/p/11740769.html