隔离级别的实现原理

简介: 排他锁(Exclusive Lock) 排他锁(Exclusive Lock) ,   简称X锁。 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。

排他锁(Exclusive Lock)

排他锁(Exclusive Lock) ,   简称X锁。

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

规则1一个数据之前加X锁, 事务提交之后释放该X锁。 

共享锁(Share lock) 

共享锁(Share lock) ,简称S锁, 这个锁和之前的排他锁X锁有区别, 主要用于读取数据。 

如果一个数据加了X锁, 就没法加S锁,没法再加X锁。

如果一个数据加了S锁, 就可以加S锁,没法再加X锁。

规则1读一个数据之前加S锁, 读完之后立刻释放该S锁。 

规则2读一个数据之前加S锁, 事务提交之后立刻释放该S锁。 

丢失修改”的问题

事务1的修改被事务2的修改覆盖了,事务1的修改像是丢失了。

排他锁可以解决两个人同时修改导致的“丢失修改”的问题,事务1修改的时候不能被其他事务修改。

读未提交(最低的事务隔离级别)-脏数据

现象:不会丢失数据,事务1还未提交的修改能被事务2读取。可以读到没有提交或者回滚的内容 (脏数据)。

原理:写数据时加上X锁,直到事务结束, 读的时候不加锁。 

读已提交-不可重复读

现象:能避免“丢失数据”和“脏数据”,事务1能读到其他已提交事务的修改,出现“不可重复读”的问题。

原理:写数据的时候加上X锁, 直到事务结束,  读的时候加上S锁, 读完数据立刻释放。(共享锁规则1)

可重复读-幻读

现象:能避免“丢失数据”和“脏数据”, “不可重复读”三个问题,事务1能读取到其他事务新插入读数据,出现“幻读”的问题。

原理:写数据的时候加上X锁,  直到事务结束, 读数据的时候加S锁, 也是直到事务结束。(共享锁规则2)

Serializable (串行化) 

现象:能避免“丢失数据”和“脏数据”, “不可重复读”,“幻读”四个问题。

原理:严格有序执行,事务不能并发执行。 

MVCC(多版本并发控制)

“串行化”隔离级别,虽然不会出错,但是效率实在太低了。  避免使用!!

“可重复读”,虽然会出现幻读,但是也能忍受。但为了实现可重复读, 需要在事务中对读操作加锁,并且得持续到整个事务结束,效率也一般,可选择使用。

隔离级别在可重复读和读已提交情况下,有没有可能在在读的时候不用加锁,也能实现可重复读?

MVCC实现了保证可重复读并在读数据的时候不需要加锁操作!! ps:但是在写数据的时候,MySQL还是要加锁的,防止写-写冲突。读写不互相等待,能极大地提高数据库的并发能力啊。

原理

给数据库里面的每张表加两个隐藏的字段:事务ID,回滚指针。(事务ID就表明这一行数据是哪个事务操作的,事务ID是一个递增的数字,每次开始新事务,这个数字就会增加。)

扩展一个Read View的数据结构记录版本数据,它有三个部分:

(1) 当前活跃的事务列表 ,即[101,102]

(2) Tmin ,就是活跃事务的最小值, 在这里 Tmin = 101 

(3) Tmax, 是系统中最大事务ID(不管事务是否提交)加上1。 在这里例子中,Tmax = 103

(注: 在可重复读的隔离级别下,当第一个Read操作发生的时候,Read view就会建立。 在Read Committed隔离级别下,每次发出Read操作,都会建立新的Read view。)

流程变化

原始数据

事务ID  回滚指针  name  age 
100 null sf 30

开启两个事务

事务id101  事务id102
开始事务    标记1  
select * from users where name='sf';  开始事务
do others things

 update users set age = 35 where name='sf';  标记2

 提交事务

select * from users where name='sf';  

在标号1 的地方,数据是这样的:  与此同时,需要建立一个叫做Read View的数据结构。

事务ID  回滚指针  name  age 
100 null sf 30

在标号为2的地方,数据是这样的:事务2做了修改,所以事务ID修改为102,回滚指针指向上一个事务ID的数据,即事务ID100

事务ID  回滚指针  name  age 
102  上一版本的数据 sf 35

 

按照可重复读的要求,事务1无论读多少次总能读到age=30的那行记录,即使事务2修改了age,也不受影响。

那么如何用来判断这些数据版本记录中哪些对你来说是可见的(可读的)。 ”

对于上面的例子,ReadView 中事务列表是[101,102], Tmin= 101, Tmax = 103,第一次读和第二次读是什么样子。

当事务101第一次读的时候,只有一条记录, tid = 100 ,小于Tmin,所以是可以读的。 然后事务102做了修改。

当事务101第二次读的时候,tid=102,程序走到了‘tid是否在Read View中这一分支,由于102确实在Read View的活动事务列表中,那就顺着回滚指针找到下一行记录,即tid为100那一行,再次判断,这就和第一次读一样了。

 

目录
相关文章
|
存储 弹性计算 Linux
阿里云账号注册、完成实名认证、试用云服务器和购买云服务器流程参考
本文为大家介绍新手用户从注册阿里云账号,完成实名认证,然后试用云服务器和购买云服务器的主要流程,适合初次购买和试用阿里云服务器的新手用户参考。
阿里云账号注册、完成实名认证、试用云服务器和购买云服务器流程参考
|
NoSQL API 数据库
基于Gin封装Web框架 - 10. 使用 context 上下文完成依赖注入
基于Gin封装Web框架 - 10. 使用 context 上下文完成依赖注入
1513 0
基于Gin封装Web框架 - 10. 使用 context 上下文完成依赖注入
|
运维 数据可视化 搜索推荐
(极态/JIT)新一代软件开发平台
极态云平台,极态云,也叫Jit、极态。是一个基于全新的软件设计理论的开发平台。他继承了经典软件开发理念理论、技术和方法,结合了最新的可视化零代码开发的价值,开创性地创造了面向元素开发方法论、元素动态管理和分层机制、应用继承、通用系统模型,可扩展的可视化工具框架,彻底解决了产业界一直以来非常棘手的许多难题和冲突,大大提升业务系统软件开发和维护的效率,也必将给产业带来更加健康的发展,可以说,是近20年来,软件开发技术最重大的一次进步。
|
监控 数据可视化 安全
软件生命周期是什么?包括哪些阶段?各阶段的目标和任务是什么?
在数字化时代,软件如同空气般无处不在,其生命周期涵盖从需求分析到退役的多个阶段,如同生物的成长过程。本文详细介绍了软件生命周期各阶段的目标与任务,并探讨了瀑布模型、迭代模型和敏捷模型等常见生命周期模型。未来,随着技术和业务的不断演变,软件生命周期管理将面临更多挑战与机遇,需不断学习先进方法和技术,以满足用户需求。
6400 0
|
机器学习/深度学习 数据采集 算法
Value(低价值密度)
Value(低价值密度)
1664 1
FLBOOK、云展网、草料二维码3款电子画册制作软件深度对比
本文亲测国内主流的电子画册制作软件,为大家精心挑选了3款电子画册制作软件,以下将根据它们的功能特点、操作界面、应用范围以及价格区间进行深度分析,帮助你选择最适合自己需求的电子画册制作工具
FLBOOK、云展网、草料二维码3款电子画册制作软件深度对比
|
XML Java 数据库连接
PropertyPlaceholderConfigurer 用法
PropertyPlaceholderConfigurer 的继承体系
PropertyPlaceholderConfigurer 用法
|
算法 安全 网络协议
阿里云如何申请国密SSL证书?
阿里云平台上线的沃通WoSign SSL证书,支持国密SM2算法和RSA算法,阿里云用户可以直接通过“云盾证书服务”申请到WoSign国密SSL证书,也可根据需要选择RSA算法的SSL证书。
4269 0
阿里云如何申请国密SSL证书?
|
存储 编解码 监控
流媒体传输协议之 RTP
本系列文章将整理各个流媒体传输协议,包括 RTP/RTCP,RTMP,希望通过深入梳理协议的设计细节,能够给流媒体领域的开发者带来一定的启发。
流媒体传输协议之 RTP
|
内存技术
STM32F103RCT6,STM32F103RCT6中文资料,STM32F103RCT6数据手册
STM32F103RCT6,STM32F103RCT6中文资料,STM32F103RCT6数据手册
1014 0