数据库隔离级别
Posted lisin-lee-cooper
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库隔离级别相关的知识,希望对你有一定的参考价值。
一.事务的四大特性
1.原子性:一个事务中的操作,要么全成功,要么全失败;
2.一致性:一个事务执行之前和执行之后都必须处于一致状态,如A向B转账,A+B的总金额转账前后总金额一致;
3.隔离性:两个事务操作同一张表时,互不影响;
4.持久性:事务一旦提交,不会丢失,改变是永久的。
二. 隔离级别
脏读:
在A 事务中读到B事务未提交的数据
不可重复读:
A 事务每次查询都读取最新数据,B 事务对数据做出多次修改时,A 事务读取的结果是每一次B事务提交后的数据。
幻读:
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(插入了新数据)
四种隔离级别解决相应的问题
1.读未提交(Read uncommitted):
这种事务隔离级别下,select语句不加锁。
此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。
2.读已提交(Read committed):
可避免 脏读 的发生。
在互联网大数据量,高并发量的场景下,几乎 不会使用 上述两种隔离级别。
3.可重复读(Repeatable read):
mysql默认隔离级别。
可避免 脏读 、不可重复读 的发生。
4.串行化(Serializable ):
可避免 脏读、不可重复读、幻读 的发生。并发执行效率最低。
三.Spring 事务传播属性
-
required(默认属性)
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。、
子事务回滚,父事务一定回滚
父事务回滚,子事务一定回滚 -
Mandatory
支持当前事务,如果当前没有事务,就抛出异常。 -
Never
以非事务方式执行,如果当前存在事务,则抛出异常。 -
Not_supports
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 -
requires_new
新建事务,如果当前存在事务,把当前事务挂起。父级事务异常,子事务正常提交 -
Supports
支持当前事务,如果当前没有事务,就以非事务方式执行。和不声明传播属性没区别 -
Nested
支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚(外层事务需要try catch)。
以上是关于数据库隔离级别的主要内容,如果未能解决你的问题,请参考以下文章