首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

InnoDB中的四种事务隔离级别的说明

我们都知道事务的几种性质,数据库中的一致性和隔离性等是实现事务的基本思想,在系统有大量的并发访问的情况下,了解和熟练应用数据库的本身的事务隔离级别,对于写出健壮性,并发处理能力强的代码还是起关键的作用。这里通过分析mysql InnoDB中事务的隔离级别,来抛砖引玉,让读者更好的理解,事务的隔离级别对于数据库数据的处理做了什么。

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)

未提交读(Read uncommitted) 可能 可能 可能

已提交读(Read committed) 不可能 可能 可能

可重复读(Repeatable read) 不可能 不可能 可能

可串行化(Serializable ) 不可能 不可能 不可能

·未提交读(Read Uncommitted):一个事务可以读取到另一个事务中未提交的数据。

·提交读(Read Committed):一个事务从开始直到提交之前,所做的任何修改对于其他事务都是不可见的。这个级别也叫不可重复读,因为两次执行的同样的查询,可能会得到不一样的结果。

·可重复读(Repeated Read):该级别保证了在同一个事务中多次对去同样结果是一致的。但是该级别还是无法解决幻读的问题:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内容插入新的记录,则之前的事务提交事务后,再次读取该范围的记录会产生幻行。

·串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

下面就使用真实的例子来说明各个级别的情况

1、未提交读(Read uncommitted)

由上可以得到,在未提交读(Read uncommitted)这个级别下,session2事务是可以读到session1中未提交事务的数据,这也就是脏读。所以这级别下是不能避免脏读的,所以这种隔离级别用到的可能性不大。

2、已提交读(Read committed)

由上面内容可以得出,在RC级别下虽然避免的脏读的情况,但是不可避免重复读导致的两次查询不一致的情况。

3、可重复读(Repeatable read)

我们知道mysql的默认的隔离级别是RR。那在这种隔离级别下是怎么避免幻读的呢?

由上可以得出,一个事务中如果使用快照读,会得到一致性的结果,如果使用了加锁的读,就会读到其他事务提交的提交的最新的数据。

本身,已提交读(Read committed) 和可重复读(Repeatable read) 两个级别是矛盾的。在同一个事务里,如果保证了可重复读,就会看不到其他事务的提交,违背了提交读;如果保证了已提交读,就会导致前后两次读到的结果不一致,违背了可重复读。所以针对这种情况可以使用加锁去查询最新的数据。

MySQL InnoDB的可重复读并不保证避免幻读,需要应用使用加锁读来保证。

对于加锁查询后的数据其他事务想操作这些事务又会出现怎样的情况,这些就涉及到了数据库中S锁X锁的问题,这些情况下还会有行锁,表锁等的问题,这些内容会在下一篇文章中去详细的说明。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180203G0JIW100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券