1、spring事务传播与隔离级别定义
1 public interface TransactionDefinition { 2 int PROPAGATION_REQUIRED = 0; 3 int PROPAGATION_SUPPORTS = 1; 4 int PROPAGATION_MANDATORY = 2; 5 int PROPAGATION_REQUIRES_NEW = 3; 6 int PROPAGATION_NOT_SUPPORTED = 4; 7 int PROPAGATION_NEVER = 5; 8 int PROPAGATION_NESTED = 6; 9 int ISOLATION_DEFAULT = -1; 10 int ISOLATION_READ_UNCOMMITTED = 1; 11 int ISOLATION_READ_COMMITTED = 2; 12 int ISOLATION_REPEATABLE_READ = 4; 13 int ISOLATION_SERIALIZABLE = 8; 14 int TIMEOUT_DEFAULT = -1; 15 }
传播行为 | 解释 | 简单理解 | 是否默认值 |
PROPAGATION_REQUIRED |
表示当前方法必须在一个事务中运行,如果调用该方法的方法雨哦一个事务,则加入事务;否则,开启一个新的事务。 | 有事务就加入,没有就开启一个 | 是 |
PROPAGATION_SUPPORTS |
表示当前方法不需要事务性上下文,但是如果有一个事务在运行,则加入。 | 有事务就加入,没有也不开启新的事务。 | 否 |
PROPAGATION_MANDATORY |
表示该方法必须运行在一个事务中。如果当前没有事务在运行,则抛出一个异常。 | 必须有事务,没有事务抛出异常。 | 否 |
PROPAGATION_REQUIRES_NEW |
表示当前方法必须运行在他自己的事务里面,他必须开启一个新的事务。如果已经有一个事务在运行,则将在这个方法运行期间老的事务被挂起。 | 开启一个新事务,若当前有事务在运行就挂起老的事务。 | 否 |
PROPAGATION_NOT_SUPPORTED |
表示该方法不应在事务中运行。如果有一个事务正在运行,该事务将被挂起。 | 不需要事务,如果有事务在运行,则挂起事务。 | 否 |
PROPAGATION_NEVER |
表示该方法不应在事务中运行。如果有事务在运行,抛出异常。 | 不能再事务中运行,如果有事务,抛出异常。 | 否 |
PROPAGATION_NESTED |
可以嵌套再其他事务中,如果有一个事务再运行则嵌套到该事务中,被嵌套的事务可以独立于外部事物进行提交或回滚。如果不存在事务,行为和PROPAGATION_REQUIRED。 | 嵌套事务,如果外部事物回滚,则嵌套事务也会回滚;外部事务提交的时候,嵌套事务也会提交。但是嵌套事务的提交或回滚不会影响到外部事物。 | 否 |
2、事务隔离级别
spring事务隔离级别最终还是交给数据库处理。spring没做特殊处理。
隔离级别 | 解释 | 名词解释 |
READ_UNCOMMITTED |
读未提交, 可以读到其他事务未commit的数据。 | |
READ_COMMITTED |
读已提交。可以读取其他事务已经提交的数据,但是可能会出现不可重复读。 | 不可重复读:不可重复读是两个并发的事务,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。 |
REPEATABLE_READ |
可重复读。可能产生幻读。 | 幻读:事务A读取,事务B写入,事务A再读取数据已经变了。事务A以为刚开始读错了。 |
SERIALIZABLE |
串行化。可避免脏读、不可重复读、幻读的发生。 |
脏读#
脏读是指一个事务读取到其他事务没有提交的数据。
不可重复读#
不可重复读是指一个事务内多次根据同一查询条件查询出来的同一行记录的值不一致。
幻读#
幻读是指一个事务内多次根据同一条件查询出来的记录行数不一致。