Mysql各种锁

news2024/11/26 21:42:29

一.不同存储引擎支持的锁机制

Mysql数据库有多种数据存储引擎,Mysql中不同的存储引擎支持不同的锁机制

MyISAM和MEMORY存储引擎采用的表级锁

InnoDB存储引擎支持行级锁,也支持表级锁,默认情况下采用行级锁

二.锁类型的划分

按照数据操作的类型分:

读锁(共享锁):针对同一份数据,多个事务可以同时读取

写锁(排他锁):执行写操作未释放锁之前,其他事务不能读取数据或者修改数据

按照数据操作的粒度分:

表级锁:开销小,加锁快,不会出现死锁,锁地粒度较大,发生冲突的概率也越大,并发性能低

行级锁:开销大,加锁慢,会出现死锁,锁定粒度较小,发生冲突的概率小,并发性能越高

行级锁分为共享锁和排它锁两种锁

行锁是Mysql锁中粒度最小的一种锁,虽然锁的粒度小,发生资源争抢的概率也小,但是也会出现死锁的情况

按照操作性能可分为乐观锁和悲观锁

乐观锁:一般的实现方式是对记录数据的版本进行对比,在提交更新的时候进行冲突检测,如果发现错误信息,则提示错误信息

悲观锁:在对一条数据修改前,先加锁,避免同时被其他人修改

三.使用Mysql行级锁的两个前提:

(1)使用innoDB引擎

(2)开启事务(隔离级别为可重复读)

这样确保在同一事务中读取的数据一致,并且在事务结束之前锁定所需的行。

START TRANSACTION;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

-- 执行对数据的操作,包括锁定行级别的操作

-- 提交事务或回滚事务
COMMIT;
-- 或
ROLLBACK;

四.InonoDB行锁的类型:

(1)共享锁:当事务对数据加上共享锁后,其他用户可以读取数据,但是不能修改数据,直到释放锁

(2)排他锁:如果事务A对数据B加上锁之后,在事务A没有释放锁之前,其他事务不能修改数据B和读取数据B。

InnoDB如何实现行锁

在做增删改查的时候加读锁,修改表结构的时候加写锁。

加锁的方式:

1.InnoDB引擎默认更新语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型

2.加共享锁:select*from table where ...lock in share mode

 加排他锁:select *from table where...fro update

五.事务的隔离级别和锁的关系

(1)事务的隔离级别是SQL92定制的标准,相当于事务并发控制的整体解决方案,而本质上是对锁和MVCC使用的封装

(2)事务隔离性使用锁来实现的,对响应的操作加不同的锁,可以防止其他事务同时对数据进行读写操作。

(3)当使用隔离级别不能解决并发问题的时候,我们可以用锁

六.行级锁产生死锁的原因:

(1)在一条事务中执行了一条没有索引条件的查询,引发全表扫描,把行级锁上升为全表记录锁定(等价于表级锁),多个这样的事务执行后,就很容易出现死锁和阻塞

如何解决:SQL语句不要有太多的复杂的关联多表查询,使用explain“执行计划”对SQL语句进行分析,对于全表扫描的语句,建立索引

(2)两个事务分别向拿到对方的锁,互相等待,产生了死锁

 (3)同一个事务中只有一个SQL,但是有些情况还是会出现锁的情况

     (1)事务1从name索引出发,读取到的[hdc,1],[hdc,6]均满足条件,加锁先[1,hdc,100],后[6,hdc,10]

      (2)事务2从pubtime索引出发,读取到的[hdc,1],[hdc,6]均满足条件,加锁先[1,hdc,100],后[6,hdc,10]

      (3)因为加锁时事务1和事务1加锁顺序正好相反,所以导致了死锁

七.MVCC

MVCC:多版本并发控制,用于实现读已提交和可重复读隔离级别

MVCC:核心是多版本链+Read view。"MV"就是通过Undo log来保存数据的历史版本,实现多版本的管理,"CC"是通过Read-view来实现管理,通过read-view原则决定数据是否显示,同时针对 不同的隔离级别,read-view的生成策略也不同,也就实现了不同的隔离级别

每个数据行当中还会有两个字段,一个是trx_id表示修改当前数据的id,另一个是roll_pointer,指向上一次修改的数据行

当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁,比如select..lock in share mode(共享锁),select ..for update、update、insert、delete(排他锁)都是当前读

快照读:快照读读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读

(1)Read Committed:每次select,都生成一个快照读

(2)Repeatable  read:开启事务第一个select语句才是快照读的地方

undolog回滚日志:

(1)回滚日志:存储老版本数据

(2)版本链:记录不同事务提交事务修改数据的版本,通过roll_pointer指针形成一个链表

当一个事务第一次执行查询sql时,会生成一致性视图read-view(快照),查询时从undo log中最新的一条记录开始跟read-view作对比,如果不符合比较规则,就根据回滚指针回滚到上一条记录继续比较,直到得到符合比较条件的查询结果。

ReadView判断某个记录版本是否可见的规则如下

当执行一次sql时会生成一致性视图read-view,它由执行查询所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务(max_id)组成,查询的数据结果需要跟read-view做对比而得到快照结果

版本链对比规则:

1.如果落在绿色部分(trx_id<min_id),表示这个版本是已提交的事务生成的,这个数据是可见的

2.如果落在红色部分(trx_id>max_id)表示这个版本是由将来的事务生成的,是不可见的

3.如果落在(min_id<=trx_id<=max_id)黄色部分包括两种情况

如果当前事务的id在未提交事务的数组中,此条记录不可读

如果当前事务的id在已提交事务的数组中,则此条记录可读

举个例子:

假设当前为可重复读

如图,当我们进行第一次查询的时候

事务100,事务200都没有提交,事务300都没有提交,此时生成的一致性视图为:

[100,200]300

此时的数据版本链为:


我们从最上边这条数据(lilei300)开始对比,这条数据trx_id  为300,落在了黄色区域,且不在

未提交事务的id[100,200]中,那么这个数据版本是可见的,所以最终读到的数据就是name为lilei300这条数据

接下来我们再来进行第二次查询

因为是可重复读此时我们的一致性视图还是[100,200]300,此时因为事务100对数据做了两次修改,此时的数据版本链为

 此时生成的一致性视图是:[200]300,此时的数据版本

我们再从上往下一次将数据和视图作比较,lilei2和liei1这两条数据trix_id都为100,此时落在了黄色区域,但是在未提交事务的数组中,属于不可读,接下来又读取lilei300这条数据,显然这条数据是可见的。

我们再开启一个新的事务读取数据:

此时的一致性视图为:[200]300,

此时的数据版本链为: 

然后再进行对比,我们发现 lilei4和lilei3这两条数据trx_id都是200,在黄色区域,但是在数组[200】里,此数据版本不可见,单但ile2这条数据trx_id为100,在绿色区域,此数据版本可见,读取的就是lilei2这条数据。如果在这个事务里再次读取,用的还是一致性视图为:[200]300,最终读取到的数据是一样的。

综上我们可以发现,在可重复读的隔离级别下,同一个事务里生成的一致性视图都是这个事务第一次执行快照读生成的视图,因此同一个事务里多次读取数据,得到的结果是一致的。

在不可重复读的隔离级别下,每一次执行快照读都会生成readview

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

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

相关文章

【LeetCode热题100】--21.合并两个有序链表

21.合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…

flutter开发实战-应用更新apk下载、安装apk、启动应用实现

flutter开发实战-应用更新apk下载、安装apk、启动应用实现 在开发过程中&#xff0c;经常遇到需要更新下载新版本的apk文件&#xff0c;之后进行应用更新apk下载、安装apk、启动应用。我们在flutter工程中实现下载apk&#xff0c;判断当前版本与需要更新安装的版本进行比对判断…

FFmpeg 命令:从入门到精通 | ffmpeg 命令分类查询

FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令分类查询 FFmpeg 命令&#xff1a;从入门到精通 | ffmpeg 命令分类查询ffmpeg -versionffmpeg -buildconfffmpeg -formatsffmpeg -muxersffmpeg -demuxersffmpeg -codecsffmpeg -decodersffmpeg -encodersffmpeg -bsfsffmpeg…

LabVIEW学习笔记五:错误,visa关闭超时(错误-1073807339)

写的串口调试工具&#xff0c;其中出现了这个错误 这是串口接收的部分&#xff0c;如果没有在很短的时间内收到外界发进来的数据&#xff0c;这里就会报错。 先在网上查了一下&#xff0c;这个问题很常见&#xff0c;我找到了官方的解答&#xff1a; VISA读取或写入时出现超时…

视频高效剪辑,批量调整视频速度,让视频更加精彩

你是否曾经需要调整多个视频的速度&#xff0c;但却苦于手动操作效率低下&#xff1f;如果你也遇到了这样的问题&#xff0c;那么是时候采取行动&#xff0c;使用一款高效易用的视频处理工具了。 首先&#xff0c;我们要进入好简单批量智剪&#xff0c;并在板块栏里选择“任务…

26358-2022 旅游度假区等级划分 思维导图

声明 本文是学习GB-T 26358-2022 旅游度假区等级划分. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了旅游度假区的等级划分和依据、总则、基本条件、省级和国家级旅游度假区条件。 本文件适用于旅游度假区的等级认定与复核依据…

pandas数据处理之构建联邦学习数据

本文以天池比赛《车辆贷款违约预测》的数据为例&#xff0c;通过pandas处理数据&#xff0c;构建联邦学习数据&#xff0c;用于FATE框架联邦学习。 通过pandas处理数据 1. 读取数据 下载car_loan_train.csv数据后&#xff0c;用pandas读取数据。 import pandas as pddatapd…

Transformers.js v2.6 现已发布

&#x1f92f; 新增了 14 种架构 在这次发布中&#xff0c;我们添加了大量的新架构&#xff1a;BLOOM、MPT、BeiT、CamemBERT、CodeLlama、GPT NeoX、GPT-J、HerBERT、mBART、mBART-50、OPT、ResNet、WavLM 和 XLM。这将支持架构的总数提升到了 46 个&#xff01;以下是一些示例…

IntelliJ IDEA 控制台中文乱码的四种解决方法

前言 IntelliJ IDEA 如果不进行配置的话&#xff0c;运行程序时控制台有时候会遇到中文乱码&#xff0c;中文乱码问题非常严重&#xff0c;甚至影响我们对信息的获取和程序的跟踪。开发体验非常不好。 本文中我总结出四点用于解决控制台中文乱码问题的方法&#xff0c;希望有助…

分布式事务-TCC异常-空回滚

1、空回滚问题&#xff1a; 因为是全局事务&#xff0c;A服务调用服务C的try时服务出现异常服务B因为网络或其他原因还没执行try方法&#xff0c;TCC因为C的try出现异常让所有的服务执行cancel方法&#xff0c;比如B的try是扣减积分 cancel是增加积分&#xff0c;还没扣减就增…

【动态规划】动态规划经典例题 力扣牛客

文章目录 跳台阶 BM63 简单跳台阶扩展 JZ71 简单打家结舍 LC198 中等打家劫舍2 LC213中等最长连续递增序列 LC674 简单乘积最大子数组LC152 中等最长递增子序列LC300 中等最长重复子数组LC718最长公共子串NC BM66最长公共子序列LC1143 中等完全平方数LC279零钱兑换 LC322 中等单…

【图像分割】图像检测(分割、特征提取)、各种特征(面积等)的测量和过滤(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

基于SSM+Vue的医院住院综合服务管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

前端最新支持四级及以下结构仿企查查、天眼查关联投资机构 股权结构 tree树形结构 控股结构

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。通过组件化开发&#xff0c;可以有效实现单…

数据结构——堆(C语言)

本篇会解决一下几个问题&#xff1a; 1.堆是什么&#xff1f; 2.如何形成一个堆&#xff1f; 3.堆的应用场景 堆是什么&#xff1f; 堆总是一颗完全二叉树堆的某个节点总是不大于或不小于父亲节点 如图&#xff0c;在小堆中&#xff0c;父亲节点总是小于孩子节点的。 如图&a…

外包干了3个月,整个人都萎靡不振了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

基于Java的美容院管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Android 内存泄漏分析思路和案例剖析

分析思路 内存泄漏是指 Android 进程中&#xff0c;某些对象已经不再使用&#xff0c;但被一些生命周期更长的对象引用&#xff0c;导致其占用的内存资源无法被GC回收&#xff0c;内存占用不断增加的一种现象&#xff1b;内存泄漏是导致我们应用性能下降、卡顿的一种常见因素&…

ROS2 中的轻量级、自动化、受控回放

一、说明 这篇文章描述了一种在 ROS2 中实现受控重播器的轻量级方法。用以测试中将现象重新播放一遍&#xff0c;以实现调参或故障定位的目的。所有源代码都可以在这里找到。该帖子也可在此处获得。 二、问题&#xff1a;不同步重播 任何曾经认真开发过 ROS2 的人都会知道这个问…

microsoft excel 公式 计算本金 利息 月供 和总利息

//可使用 Excel 公式指导算出贷款的月还款额。 PMT(rate, nper, pv, [fv], [type])//返回根据定期固定付款和固定利率而定的投资在已知期间内的本金偿付额。 PPMT(rate, per, nper, pv, [fv], [type])//基于固定利率及等额分期付款方式&#xff0c;返回给定期数内对投资的利息…