数据库的四种隔离级别

来源:互联网 发布:2016民营经济数据 编辑:程序博客网 时间:2024/05/19 04:53

数据库的四种隔离级别

隔离级别的作用

能够保证多个线程同时操作一个数据时的正确性。

隔离级别 脏读 不可重复读 幻读 读未提交(Read uncommitted) Y Y Y 读已提交(Read committed) N Y Y 可重复读(Repeatable read) N N Y 可串行化(Serializable) N N N

名词解释

1.脏读

即读取到不正确的数据,因为另一个事务可能还没提交最终数据,这个读事务就读取了中途的数据,这个数据可能是不正确的。

update account set money=money+100 where name=’B’;  (此时A通知B)update account set money=money - 100 where name=’A’;

例如:用户A向用户B转账100元,当只执行第一条SQL时,A通知B查看账户,B发现确实钱已到账(此时即发生了脏读),而之后无论第二条SQL是否执行,只要该事务不提交,则所有操作都将回滚,那么当B以后再次查看账户时就会发现钱其实并没有转。

解决方法读已提交

2.不可重复读

即在一次事务之间,进行了两次读取,但是结果不一样,可能第一次id为1的人叫“李三”,第二次读id为1的人就叫了“李四”。因为读取操作不会阻止其他事务。

不可重复读和脏读的 区别 是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。

解决方法可重复读

3.幻读

可重复读阻止的写事务包括update和delete(只给存在的表加上了锁),但是不包括insert(新行不存在,所以没有办法加锁),所以一个事务第一次读取可能读取到了10条记录,但是第二次可能读取到11条,这就是幻读。

不可重复读与幻读 区别

不可重复读的重点是修改:同样的条件, 你读取过的数据, 再次读取出来发现值不一样了
幻读的重点在于新增或者删除:一个事务第一次读取可能读取到了10条记录,但是第二次可能读取到11条

解决方法是串行化


四种隔离级别

(一)读未提交(Read uncommitted)

写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务。
存在的问题:脏读。

(二)读已提交(Read committed)

写事务会阻止其他读写事务。读事务不会阻止其他任何事务。

(三)可重复读(Repeatable read)

读事务会阻止其他写事务,但是不会阻止其他读事务。

(四)可串行化(Serializable)

读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,所以叫串行化。


  • 数据库的四种隔离级别
      • 隔离级别的作用
    • 名词解释
      • 脏读
      • 不可重复读
      • 幻读
    • 四种隔离级别
      • 一读未提交Read uncommitted
      • 二读已提交Read committed
      • 三可重复读Repeatable read
      • 四可串行化Serializable

参考:
http://blog.csdn.net/gaopu12345/article/details/50868501
http://www.cnblogs.com/fjdingsd/p/5273008.html
http://www.2cto.com/database/201604/497860.html
http://blog.csdn.net/v123411739/article/details/39298127

0 0