Spring事务管理,隔离级别,传播机制

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


事务的特性

原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

事务的隔离级别

什么是事务的隔离性

事务的隔离性是指多个事务并发执行的时候相互之间不受到彼此的干扰,是事务acid中i,根据隔离程度对隔离性有会分类。在具体介绍事务隔离性前有必要介绍几个名词说明数据库并发操作存在的问题。
首先了解几个概念:脏读、不可重复读、幻读。隔离级别就是分别解决这几个问题的

1、脏读
所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,具体来说假如有两个事务A和B同时更新一个数据d=1,事务B先执行了select获取到d=1,然后更新d=2但是没有提交,这时候事务A在B没有提交的情况下执行搜索结果d=2,这就是脏读。

2、不可重复读
所谓不可重复读是指一个事务内在未提交的前提下多次搜索一个数据,搜出来的结果不一致。发生不可重复读的原因是在多次搜索期间这个数据被其他事务更新了,比如事务A第一次读取name为张三的id=1,在此期间事务B修改了name为张三的id,改为id=2并提交了。此时事务A重新读取name为张三的id,得到的却是id=2。这就发生了重复读同一条数据得到不一样的结果了。这样在某些情况下是不符合规则的。

3、幻读
所谓幻读是指同一个事务内多次查询(注意查询的sql不一定一样)返回的结果集的不一样(比如新增或者少了一条数据),比如同一个事务A内第一次查询时候有n条记录,但是第二次同等条件下查询却又n+1条记录,这就好像产生了幻觉,为啥两次结果不一样那。其实和不可重复读一样,发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据。不同在于不可重复读是数据内容被修改了,幻读是数据变多了或者少了。

注意:虽然幻读和不可重复读有点像,但还是有区别的。不可重复读是对同一条数据进行修改后读取到不同结果。幻读是同条件下读取数据的记录路数不一样,可能新增或减少导致。

Mysql的隔离级别默认是Repeatable Read(可重复读)
Oracle的隔离级别默认是Read Committed(读已提交)
Oracle支持两种隔离级别:Read Committed 和 SERIALIZABLE(串行化)

事务的隔离级别

1、READ_UNCOMMITTED (读未提交)
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

2、READ_COMMITTED (读已提交)
保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

3、REPEATABLE_READ (可重复读)
这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

4、SERIALIZABLE(串行化)
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。
在这里插入图片描述

事务的传播机制

什么是传播机制呢

在这里插入图片描述
什么叫当前事务,假如方法method-A调用method-B,method-B的当前事务就是method-A的事务。method-B调用method-C,method-C的当前事务就是method-B的事务。
传播机制就是怎样把method-A的事务传给method-B,method-B的事务传给method-C,以及传播路径是什么。

事务传播机制总共有七种类型

如果按照类别来看大致分为两类:支持当前事务、不支持当前事务
在这里插入图片描述
1、REQUIRED(Spring默认的事务传播类型)
如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务

2、SUPPORTS
当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行

3、MANDATORY
当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常。

4、REQUIRES_NEW
创建一个新事务,如果存在当前事务,则挂起该事务。

5、NOT_SUPPORTED
始终以非事务方式执行,如果当前存在事务,则挂起当前事务

6、NEVER
不使用事务,如果当前事务存在,则抛出异常

7、NESTED(嵌套事务)
如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值