数据库隔离级别

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 事务传播属性

  1. required(默认属性)
    如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
    被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。、
    子事务回滚,父事务一定回滚
    父事务回滚,子事务一定回滚

  2. Mandatory
    支持当前事务,如果当前没有事务,就抛出异常。

  3. Never
    以非事务方式执行,如果当前存在事务,则抛出异常。

  4. Not_supports
    以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  5. requires_new
    新建事务,如果当前存在事务,把当前事务挂起。父级事务异常,子事务正常提交

  6. Supports
    支持当前事务,如果当前没有事务,就以非事务方式执行。和不声明传播属性没区别

  7. Nested
    支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。
    嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚(外层事务需要try catch)。

以上是关于数据库隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

mysql 的事务隔离级别 及各个隔离级别应用场景,详细

如何更改mysql事务隔离级别

原创|深入剖析数据库事务的隔离级别

有关数据库事务的隔离级别,描述错误的是?

数据库事务隔离级别和传播

Spring框架默认事物隔离级别