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新建事务⾃运⾏。( ⼦事务与⽗事务隔离运⾏,互不⼲涉 )spring framework表达式assign
5.5 Propagation.NESTED
⽗⽅法A没有标注事务时,⼦事务⽅法B新建事务⾃运⾏;⽗事务⽅法A标注事务时,⼦事务⽅法B回滚时不影响⽗事务⽅法A流程,但⽗事务⽅法A回滚时会⼀并回滚⼦事务⽅法B的所有操作。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。