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种)
部分数据库的默认事务隔离级别为 已提交读 ;例: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的所有操作。