数据库的四种隔离级别

数据库的四种隔离级别

隔离级别的作用

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

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

名词解释

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)

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


参考:
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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值