基础知识:
编码式事务处理:基于编码实现
声明式事务处理:基于AOP (本篇文章基于此方式)
实现方式:
配置文件:xml事务规则声明
注解:@Transactional
-
@Transactional 实现:
1.声明注解配置 DataSourceTransactionManager 也可使用注解@EnableTransactionManagement (在Springboot中可直接跳过此步骤)
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
2.使用@Transactional注解,在方法上、类上。
-
@Transactional各属性描述
name
选择指定的事务管理器(在存在多事务管理器时使用:TransactionManager)。
propagation
事务传播行为,默认为REQUIRED。已有事务则加入,否则重新创建一个。
isolation
事务隔离级别,默认为DEFAULT。
timeout
事务超时时间,默认为-1, 如果超时未完成则回滚事务。
read-only
只读事务,默认为false,无需事务处理是 可设置read-only=true。
rollback-for
事务回滚的异常类型,如果多个则逗号隔开。需继承自
RuntimeException 的异常类
no-rollback-for
抛出指定的异常类型,不回滚。
-
propagation:事务传播行为
REQUIRED required | 支持事务。存在则加入,不存在则新建 |
|
REQUIRES_NEW requires_new | 支持事务。存在则挂起当前事务,不存在则新建 |
|
NESTED nested | 支持事务。存在则嵌套成一个子事务,不存在则新建 |
|
SUPPORTS supports | 支持事务。存在则支持,不存在则不管他 | 不回滚 |
NOT_SUPPORTED not_supported | 不支持事务。存在则挂起,执行完后则恢复 | 不回滚 |
MONDATORY mondatory | 支持事务。存在则加入,不存在则抛出异常 |
|
NEVER | 不支持事务。存在则抛出异常 | 不回滚 |
-
isolation:事务隔离级别
DEFAULT | 默认使用数据库默认的隔离级别 |
|
READ_UNCOMMITTED | 未提交的事务可以被读取 | 产生脏读、不可重复读、幻读 |
READ_COMMITTED | 已提交的事务才可被读取 | 产生不可重复读、幻读 |
REPEATABLE_READ |
| 产生幻读 |
SERIALIZABLE |
| 防止脏读、不可重复读、幻读 |
-
基于注解的实现机制
- 调用注解方法
- 生成代理对象 - CglibAopProxy 调用内部类的方法DynamicAdvisedInterceptor.intercept()
- TransactionInterceptor.invoke()拦截器拦截,在目标方法执行之前创建并加入事务
- AbstractPlatformTransactionManager抽象事务管理器操作数据源DataSource提交或回滚事务