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

数据库隔离级别实现原理[通俗易懂]昨晚和以为前辈聊天,聊到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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue ant design callback问题

    vue ant design callback问题

    2020年11月9日
  • jsp填写图片的路径的两种方式

    jsp填写图片的路径的两种方式

    2021年7月18日
  • nginx负载均衡的五种算法

    nginx负载均衡的五种算法nginx负载均衡的五种算法一、Nginx负载均衡算法1、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。例如:upstreambakend{server192.168.0.1;server192.168.0.2;}2、weight(轮询权值)we…

    2022年10月12日
  • 关于以太网没有有效的ip配置问题解决方法[通俗易懂]

    关于以太网没有有效的ip配置问题解决方法[通俗易懂]错误提示解决方法一,检查IP地址是否为自动获取1,首先右键任务栏右下角的网络图标点击进入”网络和共享中心”,然后点击”更改适配器设置”。2,在适配器界面右键”本地连接”点击打开属性3,在本地连接属性界面将“Internet协议版本6(ICP/IPv6)”前面的√去掉,然后选中“Internet协议版本4(ICP/IPv4)”双击打开属性界面。4,在属性界面设置IP地址为自动获取二,重置网络环境1,右键左下角的Windows徽标,打开管理员模式的命令提示符2,输入ne

    2022年5月14日
  • Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别上篇介绍了一下静态代理:Java中的代理模式——静态代理以及分析静态代理的缺点也分析了一下静态代理的缺点:1、由于静态代理中的代理类是针对某一个类去做代理的,那么假设一个系统中有100个Service,则需要创建100个代理类2、如果一个Service中有很多方法需要事务(增强动作),发现代理对象的方法中还是有很多重复的代码3、由第一点和第二点可以得出:静态代理的重用性不强那怎…

    2022年6月29日
  • html5跟随鼠标炫酷网站引导页动画特效建议收藏

    html5跟随鼠标炫酷网站引导页动画特效一款非常不错的引导页,文字效果渐变,鼠标跟随出绚丽的条纹。html5炫酷网站引导页,鼠标跟随出特效。体验效果:http://hovertree.com/texi

    2021年12月21日

发表回复

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

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