数据库的四种隔离级别
隔离级别的作用
能够保证多个线程同时操作一个数据时的正确性。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(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)
读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,所以叫串行化。
参考:
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