数据库隔离级别

最近回过头来,发现以前的一些基础性的东西记忆不是很深了,在此重新梳理下。同时这里只是简单的记录,并没有深入的分析,因为任何一个东西都够一长篇文章的。后期有时间了可以重新写下。

数据库的事务四大特性,还有传说中的脏读、不可重复读、幻读

ACID,这个网上有很多资料不一一细说。比如这一篇就很不错。
事务的四大特性是如何保证的呢?
原子性通过undolog保证
一致性通过redolog保证
持久性通过redolog保证
隔离性通过锁机制保证
再说下自己对脏读、不可重复读、幻读的理解。
这里的理解都是以A事务为主事务,B事务为干扰事务来说明。

  • 脏读:A事务开启了事务,进行查询,这时候B事务也开启事务,进行了更新操作,但是未提交。A事务重新查了一次可以查到。总之:A事务读到了B事务未提交的数据。
  • 不可重复读:A事务读一条或者多条记录,B事务修改了这些记录,同时提交。A事务再次查看数据不同了。总之,A事务读到了B事务提交的更新记录。
  • 幻读:A事务读某个表的数据,比如大于1的有2条,但是呢B事务提交了一条记录,值为3。A再次读取多出来一条记录了。总之:A事务读到了B事务提交的插入删除记录。

数据库的隔离级别

  • Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
  • Repeatable read (可重复读):可避免脏读、不可重复读的发生。
  • Read committed (读已提交):可避免脏读的发生。
  • Read uncommitted (读未提交):最低级别,任何情况都无法保证。

mysql的事务隔离级别

环境:mysql 5.7.24,引擎:innodb
这里主要测试了rr和rc以及ru三种。
rr下测试结果是:除了不会发生脏读、不可重复读以为。也不会发生幻读。具体原因下面分析。
rc下的结果:幻读出现、不可重复读出现。脏读未出现。
ru下的结果:都出现

所以mysql数据库下的rr类比于序列化。这里用了‘类比于’是因为rr下的读是基于mvcc(多版本并发控制机制),也就是一致性读。并不是真正的序列化,且要在rr隔离级别,同事innodb引擎下。而mvcc的实现是基于undolog的。可以查看这里了解MVCC。如果想进一步去了解可以多看看网上的一些资料。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容