一、区别脏读,不可重复读,幻读
总结:不可重复读侧重于update;
幻读侧重于insert和drop;
二、隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read-Uncommited(RU) | √ | √ | √ |
Read-Commited(RC) | × | √ | √ |
RepeaTable-Read(RR) | × | × | √ |
Serialiable(RU) | × | × | × |
- Read-Uncommited(RU)(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能导致脏读、幻读或不可重复读。这个级别无疑是效率最高的,但同时也是出问题最多的级别,因为他完全就没有加锁限制。
并发时像是一大堆的人去哄抢集市摊位上的蔬菜,前面的人把黄瓜抢光了,后面的人还在往前死命的挤,小贩同时也在给好几个人称菜卖。 - Serialiable(可串行化): 最高的事务隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事物之间就可以完全不可能产生打扰,也就是说该级别可以防止脏读,不可重复读,幻读。 这个级别是效率最低,但是也是最安全的,并发读时加共享锁,其他事务只能读,而不能修改;并发写时加排它锁,其他事务既不能读也不能写。
接上面的例子,摊主让所有人排队买菜,一个一个买,后面排队的想要知道还有没有黄瓜可以对小贩喊一声问,但是小贩招待排在第一个的顾客,给第一个人称菜而且在说还有什么菜时是无暇顾及其他人的呼求的 - Read-Commited(读取已提交): 允许读取并发事务已经提交的数据,可以防止脏读,但是幻读或不可重复读仍然有可能发生。
接第一个例子,允许后面哄抢等待买菜的人问小贩黄瓜还有吗,小贩每次告知后面的人菜的数量都是排除掉第一个人已经要买的菜的数量,后面的人就知道还剩下多少黄瓜。 - RepaaTable-Read(可重复读): 对同一字段的多次读取结果都是一致的,除非是数据被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
接第一个例子,当第一个买菜的时候不会提前卖给其他人,也就是说,小贩只专注于给这一个顾客卖,其他人暂时不接待。