Spring事务隔离级别
与数据库隔离级别一致,默认隔离级别与连接的数据库隔离级别相同
Spring事务的两种实现方式
编程式事务
编程式事务是侵入性事务管理,使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。
声明式事务(@Transactional)
建立在AOP之上,其本质是对方法前后进行拦截,在目标方法开始之前创建或加入一个事务,在执行完成目标方法后根据执行情况提交或回滚事务。
声明式事务使用:第一步,开启支持@EnableTransactionManagement;第二步,在需要事务管理的服务层添加@Transactional。
注意:
- @Transactional只能用在public方法上。
- @Transactional标注的方法如果时非运行时异常,则不会回滚。
- 如果我们往上抛Exception异常(非运行时异常),我们可以指定rollbackFor属性来回滚。
@Transactional常用参数
propagation:事务传播行为
- REQUIRED,Spring的默认传播行为,若当前存在事务,则加入当前事务;若当前不存在事务,则创建一个新事物。
- REQUIRES_NEW,创建一个新事务,若当前存在事务,则把当前事务挂起。
- SUPPORTS,若存在当前事务,则加入当前事务;若当前不存在事务,则以非事务的方式继续运行。
- NOT_SUPPORTS,以非事务的方式运行,若当前存在事务,则把当前事务挂起。
- NEVER,以非事务的方式运行,若当前存在事务,则抛出异常。
- MANDATORY,若存在当前事务,则加入当前事务;若当前不存在事务,则抛出异常。
- NESTED,若存在当前事务,则创建一个事务作为当前事务的嵌套事务运行;若当前不存在事务,则相当于REQUIRED传播。
isolation:事务隔离级别
- 与数据库隔离级别划分方式相同,默认DEFAULT采用数据库的隔离级别。
timeout:事务超时时间,默认-1
- 设置超时时间,若超时,则回滚。默认-1,表示不超时。
read-only:是否只读,默认false
rollbackFor:指定能触发事务回滚的异常类型
noRollbackFor:指定不需要事务回滚的异常类型