1. 声明式事务管理
- spring进行事务管理,底层使用AOP原理。
- Spring提供了相关的API接口用于管理事务,这个接口对于不同的框架有不同的实现类。如果使用jdbc模板 则响应的接口实现类为:DataSourceTransctionManager
Sprin管理事务的方式:
- 基于注解方式(用的最多)
(1)创建事务管理器,并注入数据源
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="datdaSource" ref="dataSource">
</bean>
(2 )引入名称空间tx
<beans xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
(3) 开启事务注解
<tx:annotation-drivern tansaction-manager="transactionManager"></tx:annotation-drivern>
<!--为了防止代理混乱,JDK代理不支持类注入,只支持接口注入-->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
@Transactional该注解既可以添加到类上面,也可以添加到方法上面。添加到类上面代表对该类的所有方法开启事务,添加到方法上面表示只针对该方法开启事务。
- 基于XML配置方式
声明式事务管理参数配置
1. propagation(事务的传播)
指的是一个事务去调用另一个事务中的方法,主要有以下传播机制
@Transactional(propagation = Propagation.Required)
2. isolation(隔离级别)
设置隔离级别是为了解决并发事务问题。主要有以下几种并发事务问题:
- 脏读:一个事务读到了另一个事务还未提交的数据
- 不可重复读:一个事务先后读取同一条记录,但两次读取的结果不同
- 幻读:一个事务按照条件查询时,没有对应的行,但是准备插入时,有发现该行数据已存在
解决措施(设置事务隔离级别)
(1)read uncomitted:脏读,不可重复读,幻读都有可能出现
(2)read comitted:解决了脏读,不可重复读,幻读都有可能出现
(3)repeatable read(mysql默认):解决了脏读,不可重复读,幻读仍然有可能出现
(4)serializable:解决了所有并发事务问题,但是性能较差
@Transactional(isolation = Isaolation.Repeatable_Read)
3. timeout(超时时间)
事务需要在一定时间内提交,在指定时间内没有提交的话会进行回滚
默认值是-1,表示不提交,设置的值都是以秒为单位
@Transactional(timeout = -1)
4. readOnly(只读)
readOnly默认值为false;
设置为true后,只能读取数据库的记录
@Transactional(readOnly = false)
5. rollbackFor(回滚)
设置出现哪些异常事务进行回滚
6.noRollbackFor(不回滚)
设置出现哪些异常不进行事务回滚