回顾事务:
- 原子性
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 - 一致性
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。 - 隔离性
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 - 持久性
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
Spring 支持两种事务管理方式:
- 编程时事务 AOP
- 声明式事务 在代码中实现
基于AspectJ的XML方式
在spring核心配置文件中添加事务管理器的配置、事务的增强以及切面
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!--配置切面-->
<aop:config>
<aop:pointcut id="pointcut1" expression="execution(* com.tx.service.impl.*ServiceImpl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1" />
</aop:config>
基于注解的方式
在spring核心配置文件中添加事务管理器的配置和开启事务注解
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager" />
在事务方法中添加@Transaction注解
@Transactional
public void transferMoney(String source, String destination, Long amount) {
transferDao.payMoney(source, amount);
int i = 100/0;
transferDao.collectMoney(destination, amount);
}