InnoDB——详细解释锁的应用,一致性读,自增长与外键
一致性非锁定读
一致性的非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过行多版本控制的方式读取当前执行时数据库中行的数据。
如果读取的行正在执行 行Delete或Update操作,这时读取操作不会因此去等待行上锁的释放。相反,InnoDB会去读行的一个快照数据。
之所以称为非锁定读,因为不需要等地访问的行上X锁的释放。
快照数据是指该行的之前版本的数据,通过undo段来实现的。而undo用来在事务中回滚数据,因此快照数据本身时没有额外的开销。
此外,读取快照数据是不需要上锁的,因为没有事务需要对历史的数据进行修改操作。
因此,非锁定读机制极大地提高了数据库的并发性。InnoDB存储引擎默认采取这种读取方式,即读取不会占用和等待表上的锁。
但是在不同事务隔离级别下,读取的方式不同,并不是在每个事务隔离级别下都采用非锁定的一致性读。
此外,即使都是使用非锁定读一致性读,但是对于快照数据的定义也各不相同。
我们知道,快照数据其实就是当前行数据之前的历史版本,每行记录可能有多个版本,一般称这种技术为行多版本技术。由此带来的并发控制称为:多版本并发控制(Multi Version Concurrency Control, MVCC)。
隔离级别和非锁定的一致性读
在事务隔离级别READ COMMITED 和 REPEATABLE READ(InnoDB的默认事务隔离级别)下,InnoDB使用非锁定的一致性读。然而,对于快照数据的定义却不同。
在READ COMMITTED事务隔离级别下,对于快照数据,非一致性读总是读取被锁定行的最新一份快照数据。
而在REPEATABLE READ级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本。
一致性锁定读
上面讲了,在默认隔离级别REPEATABLE READ下,InnoDB的SELECT操作使用一致性非锁定读。
但在某些情况下,用户需要显式地对数据库读取操作进行加锁以保证逻辑的一致性。
而这要求数据库支持加锁语句,即使是对于SELECT的只读操作也可以加锁。
InnoDB支持两种一致性的锁定读(locking read)操作:
- SELECT … FOR UPDATE
- SELECT … LOCK IN SHARE MODE
SELECT … FOR UPDATE 对读取的行记录加一个X锁,其他事务不能对已锁定读行加上任何锁。
SELECT … LOCK IN SHARE MODE 对读取的行记录加一个S锁,其他事务可以向北锁定的行加S锁,但是如果该行已经加了X锁,则会被阻塞。
对于一致性非锁定读,即使读取的行已被执行了SELECT … FOR UPDATE,也是可以进行读取的(通过快照)。
此外 SELECT … FOR UPDATE 和 SELECT … LOCK IN SHARE MODE必须在一个事务中,当事务提交了,锁也就释放了。
因此在使用上述两句SELECT锁定语句时,务必加上BEGIN,START TRANSACTION或者SET AUTOCOMMIT=0。
自增长与锁
自增在在数据库中时非常常见的一种属性,也是很多开发人员首选的主键方式。
在InnoDB的内存结构中,对每个含有自增长值的表都有一个自增长计数器(auto-increment counter)。
当对含有自增长的计数器的表进行插入操作时,这个计数器会被初始化,执行如下的语句来得到计数器的值:
SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
插入操作会依据这个自增长的计数器值加1赋予自增长列。这个实现方式被称做AUTO-INC Locking。
这种锁其实是采用一种特殊的表锁机制,为了提高插入的性能,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL语句后立即释放。
虽然AUTO-INC Locking从一定程度上提高了并发插入的效率 ,但还是存在一些性能上的问题。
首先对于有自增长值的列的并发插入性能较差,事务必须等待前一个插入的完成(虽然不用等待事务的完成)。
其次,对于INSERT … SELECT的大量数据的插入会影响插入的性能,因为另一个事务中的插入会被阻塞。
从MySQL 5.1.22版本开始,InnoDB存储引擎中提供了一种轻量级互斥的自增长机制,这种机制大大提高了自增长值插入的性能。且从该版本开始,InnoDB存储引擎提供了一个参数innodb_automic_lock_mode来控制自增长的模式,该参数的默认值为1。
在继续讨论自增长实现方式之前,先对自增长的插入进行分类。
插入类型 | 说明 |
---|---|
insert-like | 只所有的插入语句,如INSERT,REPLACE、LOAD DATA等等 |
simple inserts | 只能在插入前就确定插入行树的语句。包括:INSERT、REPLACE等。不包括INSERT … ON DUPLICATE KEY UPDATE这类SQL语句 |
bulk inserts | 指在插入前不能确定得到插入行数的语句,如INSERT … SELECT, REPLACE … SELECT, LOAD DATA |
mixed-mode inserts | 指插入中有一部分是自增长,一部分是确定的。如:INSERT INTO t1(c1,c2) VALUES(1, ‘a’), (NULL,‘b’),(5,‘c’);也可以是指INSERT … ON DUPLICATE KEY UPDATE这类SQL语句 |
接下来分析innodb_autoinc_lock_mode以及各个设置下对自增的影响,其总共有三个有效值可供设定,即0、1、2,具体如下所示:
- 为0时:
MySQL5.1.22之前的实现方式,通过表锁AUTO-INC Locking方式。因为有了新的自增长实现方式,0这个选项不应该是新版用户的首选项。
- 为1时:
这是默认值。对于“simple inserts”,该值会用互斥量(mutex)去对内存中的计数器进行累加的操作。对于“bulk inserts”,还是使用传统表锁的AUTO-INC Locking方式。在这种配置下,如果不考虑回滚操作,对于自增值列的增长还是连续的。
注意,如果已经使用AUTO-INC Locing方式去产生自增长的值,而这时需要再进行“simple inserts”的操作时,还是需要等待AUTO-INC Locking的释放
- 为2时
该模式下,对于所有“INSERT-like”自增长值的产生都是通过互斥量,而不是AUTO-INC Locking方式,该模式下性能最高。
然而因为并发插入的存在,在每次插入时,自增长可能不是连续的。最重要的是,基于Statement-Base Replication会出现问题。因此,使用这个模式,任何时候都应该使用row-base replication。这样才能保证最大的并发性能及replication主从数据的一致。
注意事项:
MyISAM与InnoDB的区别
还需要特别注意InnoDB中自增长的实现和MyISAM不同,MyISAM是表锁设计,自增长不用考虑并发插入的问题。
因此在master上用InnoDB存储引擎,在slave上用MyISAM存储引擎的replication架构下,用户必须考虑这种情况。
注意用索引:
在InnoDB中,自增长的列必须是索引,同时必须是索引的第一个列。如果不是第一个列,则MySQL数据库会抛出异常,而MyISAM存储引擎没有这个问题。
外键和锁
外键主要用于引用完整性的约束检查。
在InnoDB中,对于一个外键列,如果没有显式地对这个列加索引,InnoDB会自动对其加一个索引,因为这样可以避免表锁。而Oracle不会自动增加索引,用户必须自己手动添加,这也导致了Oracle数据库中可能会产生死锁。
对于外键值的插入或更新,首先需要查询父表中的记录,即SELECT父表。
但是对于父表的SELECT操作,不是使用一致性非锁定读的方式,因为这样会发生数据不一致的问题。
因此这时使用的是SELECT … LOCK IN SHARE MODE方式,即主动对浮标加一个S锁。如果这时父表上已经这样加X锁,子表上的操作会被阻塞。
参考了这里
相关文章:
InnoDB——详细解释锁的应用,一致性读,自增长与外键
一致性非锁定读 一致性的非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过行多版本控制的方式读取当前执行时数据库中行的数据。 如果读取的行正在执行 行Delete或Update操作,这时读取操作不会因此去等待行上锁的释放。相反&…...
C++模板基础(四)
函数模板(四) ● 函数模板的实例化控制 – 显式实例化定义: template void fun(int) / template void fun(int) //header.h template<typename T> void fun(T x) {std::cout << x << std::endl; }//main.cpp #include&quo…...
pycharm使用记录
文章目录下载安装后续其他设置编辑器设置关于debug下载安装 直接去pycharm官网下载社区版,这个版本本来就是免费的,而且功能其实已经够了 后续其他设置 首先,第一次启动时,记得在preference->interpreter中设置python环境&a…...
Linux命令·kill·killall
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用CtrlC键,但是,对于一个后台进程就须用kill命令来终止,我们就需…...
Linux /proc/version 文件解析
/proc/version文件里面的内容: Linux version 4.14.180-perf (oe-user@oe-host) (clang version 10.0.5 for Android NDK, GNU ld (GNU Binutils) 2.29.1.20180115) #1 SMP PREEMPT Wed Mar 29 18:55:02 CST 2023 /proc/version文件里面记录了如下内容: 1、Linux kernel的…...
【Django 网页Web开发】15. 实战项目:管理员增删改查,md5密码和密码重置(08)(保姆级图文)
目录1. model编写数据表2. 管理员列表2.1 admin.py视图文件2.2 admin_list.html2.3 url.py2.4 最终效果3. 管理员添加3.0 md5包的书写3.1 form.py表单组件3.2 admin.py视图文件3.3 引入公共的添加数据html3.4 url.py3.5 最终效果4. 管理员编辑4.0 form表单组件4.1 admin.py视图…...
STL容器之<array>
文章目录测试环境array介绍头文件模块类定义对象构造初始化元素访问容器大小迭代器其他函数测试环境 系统:ubuntu 22.04.2 LTS 64位 gcc版本:11.3.0 编辑器:vsCode 1.76.2 array介绍 array是固定大小的序列式容器,它包含按严格…...
flask教程6:cookie和session
文章目录一、cookie1.1 什么是cookie?1.2 使用cookie1.2.1 设置cookie1.2.2设置cookie的有效期1.2.3在Flask中查询cookie1.2.4删除cookie二、session2.1实现session的两种思路2.1.1 第一种2.1.2 第二种2.2使用session2.2 .1设置session2.2.2 设置有效期2.2.3 获取se…...
【JavaEE初阶】第六节.网络原理TCP/IP协议
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、TCP/IP协议五层协议栈; 1.1 应用层协议; 二、传输层协议; 2.1 UDP协议; 2.2 TCP协议; 2.…...
模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)
模式识别 —— 第六章 支持向量机(SVM)与核(Kernel) 文章目录模式识别 —— 第六章 支持向量机(SVM)与核(Kernel)硬间隔(Hard-Margin)软间隔(Soft…...
总结 synchronized
目录synchronized的特性1. 互斥2. 刷新内存3. 可重入synchronized的使用1. 直接修饰普通方法2. 修饰静态方法3. 修饰代码块synchronized的锁机制基本特点关键锁策略 : 锁升级synchronized的特性 1. 互斥 synchronized 会起到互斥效果, 某个线程执行到某个对象的 synchronized…...
360周鸿祎又“开炮”:GPT 6-8就将产生自主意识!我们来测算一下对错
数据智能产业创新服务媒体——聚焦数智 改变商业近日,360的周鸿祎放言“GPT6到GPT8人工智能将会产生意识,变成新的物种。未来,人工智能大语言模型有可能实现自我进化,自动更新系统和自我升级,或者指数级进化能力&am…...
python——飞机大战小游戏
目录 1、导入模块 2、窗口操作 3、事件操作 4、长按事件 5、添加游戏背景 6、添加英雄飞机 7、获取飞机的图片矩形 8、基本游戏窗口 9、添加游戏窗口图片 10、英雄飞机登场 11、英雄飞机装备子弹并发射 1、enemy_plane 2、game_main 3、game_map 4、game_score …...
数组(完全二叉树)向下建堆法与堆排序O(N*logN)
TIPS AdjustUp & AdjustDown向上调整AdjustUp与向下调整AdjustDown的参数是一个数组(完全二叉树)需要进行调整操作的数值的下标/一个数组(完全二叉树)堆元素个数需要调整操作的数值的下标。实际上就是对完全二叉树当中的某一点…...
Lua require 函数使用
从 Lua 的用户文档中我们知道 require("modName") 函数是用来加载模块的,而如果这个modName已经用require 加载过的,再调用require时,将直接返回模块的值。因为函数首先查找 package.loaded 表, 检测 modName 是否被加载…...
【面试】如何定位线上问题?
这个面试题我在两年社招的时候遇到过,前几天面试也遇到了。我觉得我每一次都答得中规中矩,今天来梳理复盘下,下次又被问到的时候希望可以答得更好。 下一次我应该会按照这个思路去答: 1、如果线上出现了问题,我们更多…...
字节二面,原来我对自动化测试的理解太浅了
如果你入职一家新的公司,领导让你开展自动化测试,作为一个新人,你肯定会手忙脚乱,你会如何落地自动化测试呢? 01 什么是自动化 有很多人做了很长时间的自动化但却连自动化的概念都不清楚,这样的人也是很悲…...
Android11.0 应用升级成功后立即断电重启,版本恢复
问题:客户反馈内置的应用升级成功后立刻断电重启,应用的版本被恢复。 使用adb命令升级客户应用,查看版本显示已更新,/data/system目录下packages.xml和packages.xml中应用版本信息均已更新 C:\Users\dell>adb shell dumpsys …...
关于python常用软件用法:Pycharm 常用功能
人生苦短,我用python 一.Pycharm的基本使用 1.在Pycharm下为你的Python项目配置Python解释器 (1).Setting>Project Interpreter>源码资料电子书:点击此处跳转文末名片获取 二.在Pycharm下创建Python文件、Python模块 1.File>New&g…...
SOLIDWORKS你不知道的小技巧
◉ SOLIDWORKS圆弧长度标注点智能标注,再选中该圆弧,然后分别点圆弧的两个端点,点击左键可以标注圆弧长度。◉ SOLIDWORKS强力裁剪剪裁实体中的强劲剪裁,除了可以裁剪实体外,还可以任意延伸实体。◉ SOLIDWORKS转折线转…...
有了HTTP,为啥还要用RPC
既然有 HTTP 请求,为什么还要用 RPC 调用? 一直以来都没有深究过RPC和HTTP的区别,不都是写一个服务然后在客户端调用么? HTTP和RPC最本质的区别,就是 RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基…...
[leetcode] 动态规划
背包 先啃懂 背包九讲 01背包,即物品有限。 for 物品for 容量(倒序)P1048 [NOIP2005 普及组] 采药 [ 原题 | 题解 ] P1049 [NOIP2001 普及组] 装箱问题 [ 原题 | 题解 ] P1507 NASA的食物计划 [ 原题 | 题解 ] P1510 精卫填海 [ 原题 | 题…...
科大奥瑞物理实验——热电偶特性及其应用研究
实验名称:热电偶特性及其应用研究 1. 实验目的: 掌握电位差计的工作原理和结构特点;了解温差电偶测温的原理和方法;学会电位差计的使用及注意事项。 2. 实验器材: 电位差计 标准电池 光电检流计 稳压电源 温差电偶…...
Eclips快捷键大全(超详细)
Eclips快捷键大全(超详细)前言一、常用快捷键二、编辑快捷键三、导航快捷键四、运行和调试快捷键五、重构快捷键六、代码生成快捷键七、项目导航快捷键八、帮助快捷键九、搜索快捷键十、标记快捷键十一、版本控制快捷键十二、其它快捷键前言 本博主将用C…...
整懵了,蚂蚁金服4面成功拿下测开offer,涨薪10k,突然觉得跳槽也不是那么难
蚂蚁的面试挺独特的,每轮面试都没有HR约时间,一般是晚上8点左右面试官来一个电话,问是否能面试,能的话开始面,不能就约一个其他时间。 全程4面,前四面技术面,电话面试,最后一面是HR面…...
C++内存分布malloc-free-new-delete的区别和联系
目录 一、内存分布 1.1内存分布图: 1.2 为什么要将bss和data区分开呢? 1.3 堆和栈有什么区别 二、malloc、free;new、delete 2.1 new和delete是如何实现的,new与malloc的异同处 2.2既然有了malloc/free,C为什么还…...
【华为OD机试 2023最新 】 最多颜色的车辆(C++ 100%)
文章目录 题目描述输入描述输出描述用例题目解析C++题目描述 在一个狭小的路口,每秒只能通过一辆车,假设车辆的颜色只有 3 种,找出 N 秒内经过的最多颜色的车辆数量。 三种颜色编号为0 ,1 ,2 输入描述 第一行输入的是通过的车辆颜色信息 [0,1,1,2] 代表4 秒钟通过的车…...
Linux安全加固
一、重要文件 /etc/passwd #记录本地用户的属性信息,如UID、GID /etc/shadow #存放用户的口令信息 只有系统管理员能查看 /etc/pam.d/system-auth #账户安全配置文件 /etc/login.defs #修改登录的配置文件 /etc/profile …...
Java基础学习(6)
Java基础学习一 字符串1.1 API 与 API文档1.1.1 如何使用帮助文档查找想要导用的方法1.2 String 概述1.3 创建String对象的两种方式第一种第二种1.4 Java常用字符串方法1.4.1 比较1.4.2 字符串通过索引取出1.4.3 取出字符串中的单个字符1.4.4 替换出字符串当中的字符1.4.5 取出…...
【LeetCode】链表练习 9 道题
第一题:移除链表元素 题目描述: 给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val val的节点,并返回新的头节点 。 列表中的节点数目在范围 [0, 10^4] 内1 < Node.val < 500 < val < 50 /…...
鄞州网站设计/想做游戏推广怎么找游戏公司
chmod 指令- 修改檔案目錄權限 https://www.opencli.com/linux/chmod-command...
给别人做软件的网站/域名注册要多少钱
(一)什么是pca pca,也就是主成分分析法(principal component analysis),主要是用来对数据集进行降维处理。举个最简单的例子,我要根据姓名、年龄、头发的长度、身高、体重、皮肤的白皙程度(随便想的)等特征来预测一个人…...
如何构建自己的网站/sem优化怎么做
PAGE《计算机专业综合理论》答案及评分参考 第 PAGE 2 页 共 NUMPAGES 23 页2015年苏南五市职业学校对口单招第二次调研性统测计算机应用专业综合理论试卷本试卷分第Ⅰ卷(客观题)和第Ⅱ卷(主观题)两部分。第Ⅰ卷1页至4页,第Ⅱ卷5页至18页。两卷满分300分。考试时间1…...
wordpress淘宝客pid插件/百度seo网站优化 网络服务
testt 版权声明:本文博主原创文章,博客,未经同意不得转载。...
折叠wordpress/网上哪里可以免费打广告
编译好的控制台CS文件: cs文件单独拿出来放到F盘目录中 打开命令提示CMD: 执行下面语句即可在F盘目录中看到生成的exe文件,windows系统下双击就可运行: C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc test.cs 转载于:https:…...
网站结构 seo/软件外包公司排行
启动tomcat报错: java.lang.NoClassDefFoundError: Could not initialize class org.apache.jasper.el.ELContextImpl java.lang.NoClassDefFoundError: Could not initialize class org.apache.jsp.index_jsp 等错误 开始以为是缺少jar或者jar冲突。运行页面只…...