Spring——事务
1. 基于XML的声明式事务控制
配置事务管理器
配置事务的通知
属性
id: 事务通知的唯一标识
transaction-manager给事务通知提供一个事务管理器的引用配置AOP中的切入点表达式
建立事务通知和切入点表达式的关系
配置事务的属性(在事务通知tx:advice标签内部配置)
isolation:事务隔离界别,默认值DEFAULT,表示使用数据库的默认隔离级别
propagation:指定传播行为默认值为REQUIRED,表示一定有事务(增删改的选择,而查询方法可选择SUPPORTS)
read-only:指定事务是否只读,只有查询方法才能设置为true,默认值为falsetimeout:指定事务的超时时间 默认值-1 永不超时
rollback-for:指定一个异常,产生该异常时事务回滚,产生其他异常时不回滚。没有默认值,表示任何异常都回滚
no-rollback-for:指定一个异常,产生该异常时事务不回滚,产生其他异常时事务回滚。没有默认值,表示任何异常都回滚
以下是一个配置的例子
1 | <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> |
2.基于注解的配置
- 配置事务管理器
- 开启
Spring对注解事务的支持1
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
- 在需要支持事务的地方(类或方法前)使用
@Transactional注解。注解中的属性可以设置事务的属性(隔离级别、传播行为、只读等)
3.事务隔离级别和传播行为
1. 隔离级别
- 未提交读:可以读取未提交的数据
- 读写提交:只能读取已提交的数据,解决脏读问题(
Oracle默认级别) - 可重复读:只能读取其他事务提交修改后的数据,解决不可重复读问题(
MySQL默认级别) - 串行化:解决幻读问题
2.传播行为
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起NEVER:以非事务方式运行,如果当前存在事务,抛出异常NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。