java mysql实现原理_MySQL事务实现原理

MySQL事务隔离级别的实现原理

知识储备

只有InnoDB支持事务,所以这里说的事务隔离级别是指InnoDB下的事务隔离级别

隔离级别

读未提交:一个事务可以读取到另一个事务未提交的修改。这会带来脏读,幻读,不可重复读问题

读已提交:一个事务只能读取另一个事务已经提交的修改。其避免了脏读,仍然存在不可以重复读和幻读问题

可重复读:同一个事务中多次读取相同的数据返回的结果是一样的。其避免了脏读和不可重复读问题,但是幻读依然存在

串行化:事务串行之行。避免了以上所有问题

以上是SQL-92标准中定义的四种隔离级别。在MySQL中,默认的隔离级别是REPEATABLE-READ(可重复读),并且解决了幻读问题。

不可重复读重点在于Update和delete,而幻读的重点在于insert

MVCC

MVCC的全称是多版本并发控制。MVCC使得InnoDB的事务隔离级别下执行一致性读操作有了保证。简单说就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个用来增强并发性的强大技术,可以使得查询不用等待另一个事务释放锁。

MVCC会给每一行增加三个字段。分别是DB-TRX-ID DB-ROLL-PTR,DB-ROW-ID

增删查改

在InnoDB中,给每行增加两个隐藏字段来实现MVCC,一个用来记录数据行的创建时间,另一个用来记录行的过期时间,在实际操作中,存储的并不是时间,而是事务版本号,每开启一个新事务,事务的版本号就会递增。所以增删改查中对版本号的作用如下:

select:

读取创建版本小于或等于当前事务版本号,并且删除版本为空或大于当前事务版本的记录。这样可以保证在读取之前记录都是存在的

insert:

将当前事务的版本号保存至行的创建版本号

update

新插入一行,并以当前事务版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号

delete

将当前事务版本号保存至行的删除版本号

快照读和当前读

快照读:读取的是快照版本,也就是历史版本

当前读:读取的是最新版版

普通的select就是快照读,而update,delete,insert,select...LOCK In SHARE MODE,SELECT...for update就是当前读

一致性非锁定读和锁定读

锁定读

在一个事务中,标准的SELECT语句是不会加锁,但是有两种情况例外。SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE。

SELECT ... LOCK IN SHARE MODE:给记录假设共享锁,这样其他事务职能读不能修改,直到当前事务提交

SELECT ... FOR UPDATE:给索引记录加锁,这种情况跟UPDATE的加锁情况是一样的

一致性非锁定读

consistent read(一致性读),InnoDB用多版本来提供查询数据库在某个时间点的快照。如果隔离级别是REPEATABLE READ,那么在同一个事务中的所有一致性读都读的是事务中第一个的读读到的快照;如果是READ COMMITTED,那么一个事务中的每一个一致性读都会读到它自己刷新的快照版本。Consistent read(一致性读)是READ COMMITTED和REPEATABLE READ隔离级别下普通SELECT语句默认的模式。一致性读不会给它锁访问的表加任何形式的锁,因此其他事务可以同时并发的修改它们

Record Locks(记录锁):在索引记录上加锁

Gap Locks(间隙锁):在索引记录之间加锁,或者在第一个索引记录之前加锁,或者在最后一个索引记录之后加锁

Next-Key Locks:在索引记录上加锁,并且在索引记录之前的间隙加锁。相当于Record Locks与Gap Locks的一个结合

假如一个索引包含以下几个值:10,11,13,20.那么这个索引的next-key锁将会覆盖以下区间:

(negative infinity, 10]

(10, 11]

(11, 13]

(13, 20]

(20, positive infinity)

理论分析

在默认的隔离级别中,普通的SELECT用的是一致性读不加锁。而对于锁定读,UPDATE和DELETE,则需要加锁,至于加什么锁是有不同情况的。如果对一个唯一索引使用了唯一的检索条件,那么只需要锁定相应的索引记录就好;如果是没有使用唯一索引作为检索条件,或者用到了索引范围扫描,那么将会使用间隙锁或者next-key锁来以此阻塞其他会话向这个范围内的间隙插入数据

利用MVCC实现一致性非锁定读,保证在同一个事务中多次读取相同的数据返回的结果是一样的,解决了不可重复读问题

利用Gap Locks和Next-key可以阻止其他事务在锁定区间内插入数据,解决了幻读问题

综上所述,MySQL的默认隔离级别的实现依赖于MVCC和锁,准确点说就是一致性读和锁

https://www.cnblogs.com/develop-SZT/p/10339138.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

女大学生两块钱成功进外企

在一次招聘会上,北京某外企人事经理说,他们本想招一个有丰富工作经验的资深会计人员,结果却破例招了一位刚毕业的女大学生,让他们改变主意的起因只是一个小小的细节:这个学生当场拿出了两块钱。 人事经理说&#…

django入门项目图书管理

该项目利用了django实现了对图书的增删改查操作 步骤 1.在setting下配置好静态文件路径 STATICFILES_DIRS[os.path.join(BASE_DIR,static), ]2.models.py from django.db import models# Create your models here. class Book(models.Model):title models.CharField(max_lengt…

用gdb搞清楚一道union相关的面试题

题目并不是特别新鲜,不过这个题目在面试上肯定能筛选一大波人,特别是,有的题目大家看到很多次,但是每次都是简单看看,没有深入分析,结果笔试遇到差不多一样的题目时,自己又傻逼了。搞C语言&…

超级详细Tcpdump 的用法

第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型&#xff0…

噪声控制简史,以及几个简单的声学概念

文 | 子鱼编辑 | 贰沐 子鱼前言前段时间无意中发现了一个非常棒的声学教育平台(acoucou.org),里边内容非常丰富,涉猎面很广,同时又有很多基础知识。不仅可以给不了解声学的人领路,也可以给声学从业人员带来…

魔戒(思维+bfs)

Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒。 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E"。空间中可能存在障碍物,标为 "#",其他为可以通…

php循环读取mysql_PHP无限循环获取MySQL数据

本篇文章主要介绍PHP无限循环获取MySQL数据的方法,感兴趣的朋友参考下,希望对大家有所帮助。具体如下:public function get_data($limit){$sql"select * from ((select id,name from mytable limit {$limit},10) union all (select id,n…

熬夜给这个C语言游戏项目找了几个bug

晚上看到一个非常有意思的C语言游戏项目,这个项目完全都是用C语言写的,而且资料也比较齐全,有github资料,也有QQ群。它的项目介绍是这样的:哦,还有它的官网http://painterengine.com/index.html还有它的git…

三个监控linux网卡流量脚本

脚本1:#!/bin/bashe0_in_old$(ifconfig eth0 |grep bytes |awk {print $2" "$6} |egrep -o [0-9] |head -n1)e0_out_old$(ifconfig eth0 |grep bytes |awk {print $2" "$6} |egrep -o [0-9] |tail -n1)>e0_total_old$(($e0_in_old $e0_out_…

laravel 服务提供者

1.创建服务提供者命令 php artisan make:provider 名称 2.绑定服务 //单例绑定 $this->app->singleton(b, function () {return new \App\Http\Services\Bservice; });//普通绑定 $this->app->bind(b, function () {return new \App\Http\Services\Bservice; }); 服…

怎么算掌握了mysql_MySQL你必须掌握了解的锁知识!

一、前言MySQL 的锁按照范围可以分为全局锁、表锁、行锁,其中行锁是由数据库引擎实现的,并不是所有的引擎都提供行锁,MyISAM 就不支持行锁,所以文章介绍行锁会以InnoDB引擎为例来介绍。二、全局锁MySQL 提供全局锁来对整个数据库实…

我学机械的可以转嵌入式吗?

▼点击下方名片,关注公众号▼编排 | strongerHuang微信公众号 | 嵌入式专栏前几天,有读者在后台问,他是一个机械专业的学生,想转到嵌入式方向,问我有没有必要转?如果转嵌入式该怎么学?今天我们特…

JavaScript 正则表达式(RegExp对象、属性、方法、String支持)

内容来源:JavaScript RegExp 对象参考手册 http://www.w3school.com.cn/js/jsref_obj_regexp.asp RegExp 对象 RegExp 对象属性 RegExp 对象方法 支持正则表达式的 String 对象的方法 RegExp 对象 RegExp 对象表示正则表达式,它是对字符串执行模式匹配…

入门物联网还得靠嵌入式

小米在十一周年的发布会上,展示了一个新产品:CyberDog仿生四足机器人“铁蛋”,继腾讯X实验室的四足机器人MAX后,小米也开始跨界入局尝试研制机器狗。2020年国家会议召开,加快推动新基建建设,各产业进行数字…

mysql中定时任务_mysql中定时任务的用法

1.什么是事件一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行;mqsql的事件类似于linux的定时任务,不过是完全在m…

一文看懂 | 内存交换机制

本文基于 Linux-2.4.16 内核版本由于计算机的物理内存是有限的, 而进程对内存的使用是不确定的, 所以物理内存总有用完的可能性. 那么当系统的物理内存不足时, Linux内核使用什么方案来避免申请不到物理内存这个问题呢?相对于内存来说, 磁盘的容量是非常大的, 所以Linux内核实…

无论是cisco还是华三的书上对于子网划分有个问题需要解释

无论是cisco还是华三的书上对于子网划分有个问题,例如:如果子网为有五位 ,则可以划分为30个子网。在实际中却不是这样的 子网位五位,可以划分为32个子网。那为什么这么写,难道是出书的人写错了,其实不是。这…

mysql online ddl 5.6_MySQL 5.6的Online DDL功能测试

online DDL的前身是 innodb fast index creation(5.1和5.5), 5.6里对这个功能做了扩展:很多alter table的操作绕开了 table copying,支持DML并发操作。一、online ddl的支持测试:1、主键的增删主键添加:支持online ddl&#xff0c…

Stupid cat Doge (分形图)

【题目描述】 【题目链接】 http://noi.openjudge.cn/ch0204/8463/ 【算法】 为求等级N下的点的坐标可由几何关系找到其与等级N-1下对应点的关系&#xff0c;然后递归直至所有点的祖先&#xff08;等级0&#xff09;即可计算出坐标。 【代码】 1 #include <bits/stdc.h>2…

电赛时,如何快速搭建电路?

大家好&#xff0c;我是张巧龙&#xff0c;电赛只有四天三夜&#xff0c;电路方案可能需要多次验证&#xff0c;有的同学选择直接洞洞板焊接&#xff0c;自行跳线。有些同学可能会选择雕刻机雕刻。我带的学生一般会使用传统工艺-腐蚀法&#xff0c;这种方法的优点&#xff0c;成…