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

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


相关推荐

  • AbstractQueuedSynchronizer浅析「建议收藏」

    AbstractQueuedSynchronizer浅析「建议收藏」文章目录简介如何实现自定义同步器实现分析1.publicfinalvoidacquire(intarg)该方法以排他的方式获取锁,对中断不敏感,完成synchronized语义。简介这是一个抽象类,提供了一个FIFO(先进先出的队列),可以用来构建锁或者其他同步装置的基础框架。该同步器利用intstate来表示一个状态。子类通过继续该抽象类并实现他的方法来管理其状态,管理方式是通过acquire(intarg)方法release(intarg)方法来操作状态。多线程环境中对状

    2022年9月25日
    2
  • Linux查看开放端口_linux查看对外端口

    Linux查看开放端口_linux查看对外端口linux查看并对外开放端口(防火墙拦截处理) 查看端口是否可访问:telnetip端口号(如本机的35465:telnetlocalhost35465)开放的端口位于/etc/sysconfig/iptables中查看时通过more/etc/sysconfig/iptables命令查看如果想开放端口(如:8889)(1)通过v…

    2022年9月18日
    2
  • mysql list table_java resultset转list

    mysql list table_java resultset转list我在Orcle里写了一个Sql语句,用到了LISTAGG,现在要改成mysql数据库,我要怎么改这个Sql语句?SELECTA.GUID,A.COMPANY_GUID,A.GOODS_CODE,A.GOODS_NAME,A.SPECIFICATIONS,A.SMALL_IM…我在Orcle里写了一个Sql语句,用到了LISTAGG,现在要改成mysql数据库,我要怎么改这个Sql语句?SELE…

    2022年9月6日
    7
  • 网管必备工具_ps功能介绍与工具使用视频

    网管必备工具_ps功能介绍与工具使用视频http://book.51cto.com/art/200903/116214.htm 转载于:https://blog.51cto.com/netsecing/163178

    2022年10月5日
    2
  • Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)

    Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)权限简介   Linux系统上对文件的权限有着严格的控制,用于如果相对某个文件执行某种操作,必须具有对应的权限方可执行成功。   Linux下文件的权限类型一般包括读,写,执行。对应字母为r、w、x。   Linux下权限的粒度有拥有者、群组、其它组三种。每个文件都可以针对三个粒度,设置不同的rwx(读写执行)权限。通常情况下,一个文件只能归属于一个用户和组,如果其它的用…

    2022年6月25日
    93
  • 解决Linux TIME_WAIT过多造成的问题[通俗易懂]

    解决Linux TIME_WAIT过多造成的问题[通俗易懂]1、time_wait的作用:TIME_WAIT状态存在的理由:1)可靠地实现TCP全双工连接的终止在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出co…

    2022年6月10日
    55

发表回复

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

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