乐观锁的颗粒度_MySql数据库锁机制详解

8575b7e835b05be781c3abdebad2666f.png

概述

数据库锁定机制简单的来说,就是数据库为了保证数据的一致性与完整性,而使各种共享资源在被并发访问时变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁机制,所以MySQL也不能例外。MySQL数据库根据锁锁定数据的颗粒度可分为表级锁、行级锁和页级锁。

一、表级锁

1.1 什么是表级锁

表级锁会直接锁定整张表。表级锁是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免死锁问题。当然,锁定颗粒度大所带来负面影响就是出现争用锁定资源的概率也会最高,致使并发度大大降低。

1.2 表级锁的锁模式

MySQL的表级锁有两种模式:表共享读锁和表独占写锁;表共享读锁,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;表独占写锁,会阻塞其他用户对同一表的读和写操作;表共享读锁与表独占写锁之间,以及表独占写锁之间是串行的。当一个线程获得对一个表的写锁后,只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待,直到锁被释放为止。

1.3 表锁优化建议

虽然使用表级锁定在锁定实现的过程中比实现行级锁定或者页级锁所带来的附加成本都要小,锁定本身所消耗的资源也最少。但是由于锁定的颗粒度比较大,所以造成争用锁定资源的情况也会比其他的锁级别都要多,从而在较大程度上会降低并发处理能力。所以,在优化表级锁问题的时候,最关键的就是如何让其提高并发度。由于锁定级别是不可能改变的了,所以我们首先需要尽可能让锁定的时间变短,然后就是让可能并发进行的操作尽可能的并发。

二、行级锁

2.1 什么是行级锁

行级锁仅对指定的记录加锁。行级锁最大的特点就是锁定对象的颗粒度小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生争用锁定资源的概率也最小,能尽可能大的提高数据库的并发处理能力从而提高高并发应用系统的性能。虽然行级锁能够极大提高并发处理能力,但是由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。

2.2 行级锁的锁模式

MySQL行级锁有共享锁和排他锁两种。当一个事务需要给自己需要的某个资源加锁的时候,如果遇到一个共享锁正锁定着自己需要的资源的时候,自己可以再加一个共享锁,不过不能加排他锁。但是,如果遇到自己需要锁定的资源已经被一个排他锁占有之后,则只能等待该锁定释放资源之后自己才能获取锁定资源并添加自己的锁定。如果一个事务请求的锁模式与当前的锁兼容,InnoDB就将请求的锁授予该事务;反之,如果两者不兼容,该事务就要等待锁释放。

2.3 行锁优化建议

InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。下面通过一些实际例子来加以说明。

1、在不通过索引条件查询的时候,InnoDB确实使用的是表锁,而不是行锁;

2、由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的查询条件,是会出现锁冲突的;

3、当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁;

4、即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁;

2.4 间隙锁

当我们用范围条件而不是相等条件检索数据并请求共享锁或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是间隙锁。

假如userInfo表中只有50条记录,其userId的值分别是1,2,3,....,49,50;

下面的SQL:

mysql> select * from emp where userId > 49 for update;

是一个范围条件的检索,InnoDB不仅会对符合条件的userId值为50的记录加锁,也会对userId大于50(这些记录并不存在)的“间隙”加锁。

InnoDB使用间隙锁的目的是防止幻读,以满足相关隔离级别的要求。对于上面的例子,如果不使用间隙锁,若其他事务插入了userId大于50的任何记录,那么本事务如果再次执行上述语句,就会发生幻读;因为间隙锁锁定的是一个范围,而不是具体的索引键所以在使用范围条件检索并锁定记录时,间隙锁会将不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。因此,在实际应用开发中,尤其是并发插入比较多的应用,我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据,避免使用范围条件。还要特别说明的是,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁。

2.5 行锁优化建议

1、尽量让所有的查询条件都通过索引来完成,从而避免InnoDB因为无法通过索引键加锁而升级为表级锁定;

2、合理设计索引,让InnoDB在索引键上面加锁的时候尽可能准确,尽可能的缩小锁定范围,避免造成不必要的锁定而影响其它SQL的执行;

3、减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的记录;

4、尽量控制事务的大小,减少锁定的资源量和锁定时间长度;

5、在业务环境允许的情况下,可使用较低级别的事务隔离,以减少MySQL因为实现事务隔离级别所带来的附加成本;

6、类似业务模块中,尽量按照相同的访问顺序来访问,防止产生死锁;

7、在同一个事务中,尽量做到一次锁定所需要的所有资源,减少死锁产生概率;

8、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

三、页级锁

页级锁是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。

在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。

总的来说,MySQL这3种锁的特性可大致归纳如下:

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

四、行级锁和表级锁能共存吗?

行级锁与表级锁是可以共存的。InnoDB为了让表锁和行锁共存而引入了意向锁。

举个例子(此时假设行锁和表锁能共存): 事务A锁住表中的一行(写锁)。事务B锁住整个表(写锁)。

但你就会发现一个很明显的问题,事务A既然锁住了某一行,其他事务就不可能修改这一行。这与"事务B锁住整个表就能修改表中的任意一行"形成了冲突。所以,没有意向锁的时候,行锁与表锁共存就会存在问题!

那么意向锁是如何让表锁和行锁共存的?

有了意向锁之后,前面例子中的事务A在申请行锁(写锁)之前,数据库会自动先给事务A申请表的意向排他锁。当事务B去申请表的写锁时就会失败,因为表上有意向排他锁之后事务B申请表的写锁时会被阻塞。由此我们可得出意向锁是表锁。

(更多文章可关注微信公众号:IT鸡窝)

参考文章:https://blog.csdn.net/zcl_love_wx/article/details/82015281https://www.cnblogs.com/sessionbest/articles/8689071.html

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

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

相关文章

云溪怎么导入dxf_dwg怎么转换成dxf文件?超详细图文教程分享

在CAD相关的工作中,我们经常遇到这种问题,需要把DWG格式的CAD图纸转换成DXF格式。那么,我们应该怎么做呢?接下来为你介绍这一个方法,非常方便快速哦。准备电脑风云CAD转换器具体步骤:在桌面上新建文件夹,将…

特斯拉是l3还是l2_比特斯拉还“高一级”,长安的“L3级自动驾驶”到底什么来头?...

3月5日,长安发布了旗下全新轿跑SUV——UNI-T,新车一经亮相,便凭借极具科幻的造型,以及越级的动力性能吸粉无数。而在大家意犹未尽之时,长安又在3月10日,通过UNI-T发布了“L3级自动驾驶”量产体验&#xff0…

mysql5.7.17配置_mysql-5.7.17-winx64的安装配置

第一步:下载mysql-5.7.17-winx64解压版本:http://dev.mysql.com/downloads/mysql/第二步:解压到安装目录,如:C:\myprogram\mysql-5.7.17-winx64第三步:设置环境变量操作如下:1)右键单击我的电脑…

openstack实例控制台显示响应时间过长_监控OpenStack的技巧

如果你以前曾在云平台上工作过,你一定熟悉这些系统的分布式和解耦性质。解耦的分布式系统依赖于微服务来执行特定的任务,每个微服务都会暴露自己的REST(表示状态转移)API。这些微服务通常以诸如RabbitMQ或QPID等消息中间件的形式通过轻量级消息层相互通信…

java8 创建list方式_Java 8 创建 Stream 的 10 种方式,我保证你受益无穷!

今天来分享下在 Java 8 中创建 Stream 的 10 种方式,我就整理了 10 种,其实还有更多,仅供大家参考学习下。 1、Stream.of 可变参数 Stream<String> stream1 = Stream.of("A", "B", "C"); System.out.println("stream1:" + st…

js map满足条件跳出循环_js.es5 map循环一大坑:循环遍历竟然出现逗号!

一、mapmap大法好作为当今程序界最好用的循环方法之一map, 在我的项目里基本替代了for循环map循环常用的一些方法/********* ES6 **********///一行代码可以省略returnarray.map( item > console.log(item))>array.map( item > {return console.log(item)})//多行代码…

micropython按键控制流水灯_【micro:bit Micropython】The LED Display(1)控制像素点

使用DFrobot研发的micropython编程软件uPyCraft&#xff0c;下载固件(Firmware)和下载程序都非常方便。可以在DFrobot论坛中进行下载。uPyCraft软件运行界面官网中的micro:bit Micropython API介绍得非常详细&#xff0c;为开发人员提供了详细的文字说明和参照。micro:bit Micr…

python中exp_python中的exp是什么

Python exp() 函数描述exp() 函数返回 x 的指数&#xff0c;。语法import mathmath.exp(x)注意&#xff1a;exp() 是不能直接访问的&#xff0c;需导入 math 模块&#xff0c;通过静态对象调用该方法。参数x -- 数值表达式。返回值返回 x 的指数&#xff0c;。实例# -*- coding…

python干货_python 基础干货 02

list 与 tuplelist 类似 数组tuple 跟 list 一样, 只是一旦定义, 里边的内容不可以改变.这样, 上边的内容就不可以改变了."可变的" tuple, 不是说 tuple 是不可以改变的么?想内存dict 与 setdict 是 python内置字典, 其他语言中称为 map, 使用键-值(key-value)存储&…

mysql安装目录问题_Windows下MySQL的安装目录问题

今天发现一个MySQL的问题&#xff0c;当把MySQL的文件目录安放在t字母打头的目录下时&#xff0c;比如d:/test目录&#xff0c;mysql服务就起不来了&#xff0c;报告找不到文件:D:/test/mysql>bin/mysqld-nt.exe --console090811 10:09:55 [ERROR] Cant find messagefile D:…

大学考试分数越高学分越多吗_大学的绩点和学分有什么用?影响学生毕业吗

原标题&#xff1a;大学的绩点和学分有什么用&#xff1f;影响学生毕业吗网友一&#xff1a;读大学也要关心成绩&#xff0c;绩点和学分是两个重要指标&#xff0c;到底是什么&#xff0c;怎么计算&#xff1f;有什么用处&#xff1f;为什么很重要&#xff1f;面试官最看重哪些…

pandas输出到excel_python读写excel等数据文件方法汇总

python处理数据文件第一步是要读取数据&#xff0c;文件类型主要包括文本文件&#xff08;csv、txt等&#xff09;、excel文件、数据库文件、api等。下面整理下python有哪些方式可以读取数据文件。1. python内置方法&#xff08;read、readline、readlines&#xff09;read()&a…

dijkstra算法_Python实现图的经典DFS、BFS、Dijkstra、Floyd、Prim、Kruskal算法

讲在前面的话&#xff0c;图的算法太多&#xff0c;理论知识肯定一篇文章讲不完&#xff0c;关于理论知识大家可以参考教材Sedgewick的《算法》或reference的链接,本文主要还是想在一篇文章中记录六种算法的Python代码。同样想吐槽一下&#xff0c;虽然网上博客很多&#xff0c…

深度学习试题_高中生物:今年高考试题3点显著变化及5个备考建议!不看准吃亏...

新课标下的新高考即将开启&#xff0c;最后一届旧高考模式在不同寻常的2020年七月份已圆满结束。今年全国Ⅰ卷理综生物试题有几个明显变化。1.内容、范围不变&#xff0c;考查理解能力和实践能力加强作为过渡期的高考&#xff0c;全国高考Ⅰ卷理综生物试题题型结构保持不变&…

电脑工具栏怎么调整到下面_雷电模拟器4.0怎么玩召唤与合成 一键下载轻松游玩 - 工具软件...

召唤与合成是一款既不是卡牌&#xff0c;也不是消除&#xff0c;也不算策略的高烧脑解谜手游&#xff0c;很多玩家想要利用雷电模拟器来在电脑上运行手游&#xff0c;却不知道怎么操作&#xff0c;下面就来教教大家如何在雷电模拟器上玩召唤与合成。1、首先要下载游戏&#xff…

ESP8266网络相框采用TFT_eSPI库TJpg_Decoder库mixly库UDP库实现图片传送

用ESP8266和TFT_ESPI模块来显示图片数据。具体来说&#xff0c;我们将使用ILI9431显示器作为显示设备&#xff0c;并通过UDP协议将图片数据从发送端传输到ESP8266。最后&#xff0c;我们将解析这些数据并在TFT屏幕上显示出来。在这个过程中&#xff0c;我们将面临一些编程挑战&…

c++ vector 一部分_为什么现在的手机都采用Type-C接口?它到底好在哪里?看完你就明白了...

不知道你们有没有发现&#xff0c;现如今的安卓手机几乎都使用Type-C接口。前两年还只是大部分手机采用的Micro USB接口&#xff0c;只有很小一部分使用的是Type-C接口。那到底是什么原因导致它&#xff0c;能在那么快的速度几乎在业内通用呢&#xff1f;一、使用方便&#xff…

java listen_Java进阶-IO基础

计算机最重要的功能是处理数据。一个有用的计算机语言需要拥有良好的IO功能&#xff0c;以便让未处理的数据流入程序&#xff0c;让已处理的数据流出。与其他语言相比&#xff0c;Java的IO功能显得复杂。在其他语言中&#xff0c;许多IO功能(比如读取文件)&#xff0c;是被封装…

gorm preload 搜索_文件太多忘记了文件放在什么地方?那你可以试试这款文件搜索工具...

忘记了文件放在什么地方&#xff1f;文件太多不能一下子找到&#xff1f;那么你也许可以试试这款软件——ProFind for mac版&#xff0c;这是一款适用于macOS系统的文件搜索工具&#xff0c;它具有强大的功能和出色的性能&#xff0c;可为macOS提供高级文件搜索&#xff0c;并支…

c++ ftp服务端_FTP客户端软件介绍及使用

FTP客户端软件介绍及使用 客户端软件&#xff1a; ftp&#xff0c;lftp&#xff0c;lftpget&#xff0c;wget&#xff0c;curl ftp -A ftpserver port -A 主动模式 –p 被动模式 lftp –u username ftpserver lftp usernameftpserver lftpget ftp://ftpserver/pub/file gftp&am…