数据库隔离级别实现原理[通俗易懂]

数据库隔离级别实现原理[通俗易懂]昨晚和以为前辈聊天,聊到Mysql的引擎innodb默认的事务隔离级别是REPEATABLEREAD(可重复读);在Oracle中默认的事务隔离级别是提交读(readcommitted)。那么,问题来了,在Mysql中的隔离级别是怎么实现的呢?关于数据库数据隔离级别在之前的博客中总结过:https://blog.csdn.net/qq_34417408/article/details/79…

大家好,又见面了,我是你们的朋友全栈君。

昨晚和以为前辈聊天,聊到Mysql的引擎innodb默认的事务隔离级别是REPEATABLE READ(可重复读);在Oracle中默认的事务隔离级别是提交读(read committed)。那么,问题来了,在Mysql中的隔离级别是怎么实现的呢?
关于数据库数据隔离级别在之前的博客中总结过:https://blog.csdn.net/qq_34417408/article/details/79935859;下面主要说说原理:
READ_UNCOMMITED 的原理:

事务对当前被读取的数据不加锁;
事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级共享锁,直到事务结束才释放。
表现:

事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,能读到事务2对该记录的修改版本,即使该修改尚未被提交。
事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。
READ_COMMITED 的原理:

事务对当前被读取的数据加 行级共享锁(当读到时才加锁),一旦读完该行,立即释放该行级共享锁;
事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
表现:

事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的只能是事务2对其更新前的版本,要不就是事务2提交后的版本。
事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。
REPEATABLE READ 的原理:

事务在读取某数据的瞬间(就是开始读取的瞬间),必须先对其加 行级共享锁,直到事务结束才释放;
事务在更新某数据的瞬间(就是发生更新的瞬间),必须先对其加 行级排他锁,直到事务结束才释放。
表现:

事务1读取某行记录时,事务2也能对这行记录进行读取、更新;当事务2对该记录进行更新时,事务1再次读取该记录,读到的仍然是第一次读取的那个版本。
事务1更新某行记录时,事务2不能对这行记录做更新,直到事务1结束。
SERIALIZABLE 的原理:

事务在读取数据时,必须先对其加 表级共享锁 ,直到事务结束才释放;
事务在更新数据时,必须先对其加 表级排他锁 ,直到事务结束才释放。
表现:

事务1正在读取A表中的记录时,则事务2也能读取A表,但不能对A表做更新、新增、删除,直到事务1结束。
事务1正在更新A表中的记录时,则事务2不能读取A表的任意记录,更不可能对A表做更新、新增、删除,直到事务1结束。

这里涉及到排他锁和共享锁,解释一波:

共享锁【S锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁【X锁】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

这个和之前的数据库隔离级别博客一起看比较易懂。同时也自省一下,在技术的道路上,永远做个小白,勇于探索底层,向届内前辈看齐!同时,多沟通,多实践,多总结,多积累,勇于发现自己的短板。共勉!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141536.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java和python区别_Python和Java之间的区别:主要功能

    java和python区别_Python和Java之间的区别:主要功能java和python区别Python或Java,哪个更好?这个问题在全球开发者社区引发了许多激烈的讨论。初学者开发人员可能对应该掌握两者中的哪一个有所怀疑。初创公司和公司可能想知道哪种方案在他们的下一个项目中会更好。这两种语言都可以以相同的效率解决许多任务,这不足为奇。但是,在某些情况下,一个人可以击败另一个人。在本文中,我们将基于多个方面来分析它们的优缺点。对于那…

    2022年7月7日
    24
  • 解决idea的控制台输出Tomcat日志乱码问题「建议收藏」

    解决idea的控制台输出Tomcat日志乱码问题「建议收藏」解决idea的控制台输出Tomcat日志乱码问题乱码原因由于window下的idea默认编码集都默认是GBK,而Tomcat目前版本是UTF-8,所以会出现乱码。第一种解决方案:将Tomcat输出日志的编码改为GBK在Tomcat的config目录下有一个logging.properties文件,文件中可以在五个地方设置编码,分别对应红色圆圈内五个日志输出文档(默认只选中了两个),将UTF-8的地方全改成GBK1catalina.org.apache.juli.FileHandler.l

    2022年9月25日
    0
  • stat函数使用

    stat函数使用要点 通过 stat 函数获取文件属性代码示例 运行结果 a outa outatime mtime ctime a outxyz outErroroccu

    2025年7月31日
    2
  • STN:空间变换网络(Spatial Transformer Network)「建议收藏」

    STN:空间变换网络(Spatial Transformer Network)「建议收藏」空间变换网络(SpatialTransformerNetwork)空间变换网络(SpatialTransformerNetwork)空间变换器(SpatialTransformers)本文的惨开文献为:《SpatialTransformerNetworks》卷积神经网络定义了一个异常强大的模型类,但在计算和参数有效的方式下仍然受限于对输入数据的空间不…

    2022年10月19日
    0
  • 谢烟客———Linux之Bash基础特性(1)

    谢烟客———Linux之Bash基础特性(1)

    2022年3月5日
    41
  • SSL证书安装指引

    SSL证书安装指引https://cloud.tencent.com/document/product/400/4143下载得到的www.domain.com.zip文件,解压获得3个文件夹,分别是Apache、

    2022年8月2日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号