上面的例子中咱们使用了默认的事务配置,能够知足一些基本的事务需求,可是当咱们项目较大较复杂时(好比,有多个数据源等),这时候须要在声明事务时,指定不一样的事务管理器。对于不一样数据源的事务管理配置能够见《Spring Boot多数据源配置与使用》中的设置。在声明事务时,只须要经过value属性指定配置的事务管理器名便可,例如:@Transactional(value="transactionManagerPrimary")
。html
除了指定不一样的事务管理器以后,还能对事务进行隔离级别和传播行为的控制,下面分别详细解释:spring
#### 隔离级别数据库
隔离级别是指若干个并发的事务之间的隔离程度,与咱们开发时候主要相关的场景包括:脏读取、重复读、幻读。springboot
咱们能够看org.springframework.transaction.annotation.Isolation
枚举类中定义了五个表示隔离级别的值:并发
public enum Isolation { DEFAULT(-1), READ_UNCOMMITTED(1), READ_COMMITTED(2), REPEATABLE_READ(4), SERIALIZABLE(8); }
DEFAULT
:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,一般这值就是:READ_COMMITTED
。READ_UNCOMMITTED
:该隔离级别表示一个事务能够读取另外一个事务修改但尚未提交的数据。该级别不能防止脏读和不可重复读,所以不多使用该隔离级别。READ_COMMITTED
:该隔离级别表示一个事务只能读取另外一个事务已经提交的数据。该级别能够防止脏读,这也是大多数状况下的推荐值。REPEATABLE_READ
:该隔离级别表示一个事务在整个过程当中能够屡次重复执行某个查询,而且每次返回的记录都相同。即便在屡次查询之间有新增的数据知足该查询,这些新增的记录也会被忽略。该级别能够防止脏读和不可重复读。SERIALIZABLE
:全部的事务依次逐个执行,这样事务之间就彻底不可能产生干扰,也就是说,该级别能够防止脏读、不可重复读以及幻读。可是这将严重影响程序的性能。一般状况下也不会用到该级别。指定方法:经过使用isolation
属性设置,例如:性能
@Transactional(isolation = Isolation.DEFAULT)
所谓事务的传播行为是指,若是在开始当前事务以前,一个事务上下文已经存在,此时有若干选项能够指定一个事务性方法的执行行为。spa
咱们能够看org.springframework.transaction.annotation.Propagation
枚举类中定义了6个表示传播行为的枚举值:code
public enum Propagation { REQUIRED(0), SUPPORTS(1), MANDATORY(2), REQUIRES_NEW(3), NOT_SUPPORTED(4), NEVER(5), NESTED(6); }
REQUIRED
:若是当前存在事务,则加入该事务;若是当前没有事务,则建立一个新的事务。SUPPORTS
:若是当前存在事务,则加入该事务;若是当前没有事务,则以非事务的方式继续运行。MANDATORY
:若是当前存在事务,则加入该事务;若是当前没有事务,则抛出异常。REQUIRES_NEW
:建立一个新的事务,若是当前存在事务,则把当前事务挂起。NOT_SUPPORTED
:以非事务方式运行,若是当前存在事务,则把当前事务挂起。NEVER
:以非事务方式运行,若是当前存在事务,则抛出异常。NESTED
:若是当前存在事务,则建立一个事务做为当前事务的嵌套事务来运行;若是当前没有事务,则该取值等价于REQUIRED
。指定方法:经过使用propagation
属性设置,例如:htm
@Transactional(propagation = Propagation.REQUIRED)
源码来源blog