Spring:Spring事务的4种特性、5种隔离级别、7种传播特性

此文章只作笔记记录,不作为讲解文章

1. 事务的特性(4种)

原子性 (atomicity):强调事务的不可分割.
一致性 (consistency): 事务的执行的前后数据的完整性保持一致.
隔离性 (isolation): 事务执行的过程中, 不受其他事务的干扰, 即并发执行的事物之间互不干扰
持久性(durability) : 事务一旦结束, 数据就持久到数据库

2. 事务诱发的问题

2.1 脏读

 事务A读到了事务B的已操作但未提交的数据.

2.2 不可重复读

 事务A有多次查询,第一次读取数据后继续运行,第二次读到了事务B已经提交的 update 的数据导致 事务A 内的多次查询结果不一致.

2.3 幻读

 事务A有多次查询,第一次读取数据后继续运行,第二次读到了事务B已经提交的 insert ( delete )的数据导致 事务A 内的多次查询结果不一致.

2.4 事务丢失( 回滚丢失 )

 事务A运行增删改操作后( 还未提交 ),事务B也运行增删改操作并提交,事务A继续运行后报错进行事务回滚时,此时就会把事务B的操作清除掉。

2.5 事务丢失( 提交丢失 )

事务A与事务B同时对一组数据运行增删改操作,事务B先一步提交事务,事务A继续运行后也提交事务,此时就会把事务B的操作清除掉。

3. 数据库的事务隔离级别(4种)

Spring:Spring事务的4种特性、5种隔离级别、7种传播特性

部分数据库的默认事务隔离级别为 已提交读 ;例:SQL Server、Oracle

Mysql的默认事务隔离级别为:可重复读

4. 事务的隔离级别(5种)

4.1 ISOLATION_DEFAULT 

  使用数据库默认的隔离级别

4.2 ISOLATION_READ_UNCOMMITTED 

  事务最低的隔离级别 ( 可能会导致 脏读,不可重复读,幻读 )

4.3 ISOLATION_READ_COMMITTED

  保证一个事务修改的数据提交后才能被另外一个事务读取 ( 可能会导致 不可重复读,幻读 )

4.4 ISOLATION_REPEATABLE_READ

  保证一个事务修改的数据提交后才能被另外一个事务读取 ( 可能会导致 幻读 )

  保证一个事务读取数据后,另外一个事务才能修改 ( 可能会导致 幻读 )

4.5 ISOLATION_SERIALIZABLE

   这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行 ( 执行效率最慢 )

5. 事务的传播特性(7种)

  ( 事务嵌套调用问题 ) 当事务方法A内部调用事务方法B时,子事务方法B出现事务报错,其父事务方法A是否回滚事务、事务报错、正常运行?

注:如下所有配置特性都是作用在子事务方法B的。

第一类:父事务方法有事务时,支持父事务方法

5.3 Propagation.SUPPORTS

父方法A没有标注事务时,子事务方法B按照非事务的方法运行(报错不回滚);父事务方法A标注事务时,子事务方法B绑定父事务方法A的事务一起运行、回滚、提交、报错。

5.6 Propagation.REQUIRED

父方法A没有标注事务时,子事务方法B新建事务自运行;父事务方法A标注事务时,子事务方法B与父事务方法A的事务合并运行无论哪个事务出错都一起回滚、或者一起提交。

5.7 Propagation.MANDATORY

父方法A没有标注事务时,子事务方法B报错抛出异常;父事务方法A标注事务时,子事务方法B绑定父事务方法A的事务一起运行、回滚、提交、报错。

第二类:父事务方法有事务时,隔离父事务方法另辟新事务运行或者直接报错

5.1 Propagation.NEVER

父方法A没有标注事务时,子事务方法B正常运行事务;父事务方法A标注事务时,子事务方法B直接报错。

5.2 Propagation.NOT_SUPPORTED

父方法A没有标注事务时,子事务方法B按照非事务的方法运行(报错不回滚);父事务方法A标注事务时,子事务方法B把父事务方法A挂起,然后子事务方法B按照非事务的方法运行(报错不回滚),之后子事务方法A继续运行自己的事务。

5.4 Propagation.REQUIRES_NEW

父方法A没有标注事务时,子事务方法B新建事务自运行;父事务方法A标注事务时,子事务方法B把父事务方法A挂起,然后子事务方法B新建事务自运行。( 子事务与父事务隔离运行,互不干涉 )

5.5 Propagation.NESTED

父方法A没有标注事务时,子事务方法B新建事务自运行;父事务方法A标注事务时,子事务方法B回滚时不影响父事务方法A流程,但父事务方法A回滚时会一并回滚子事务方法B的所有操作。