MySQL的行锁总结

news2024/10/7 12:22:04

文章目录

  • 前言
  • 一、行锁的介绍
  • 二、行锁的使用
  • 三、使用行锁所带来的问题
  • 四、死锁和死锁检测


前言

上篇文章已经学习了MySQL的全局锁和表锁,今天这篇文章我们对行锁进行以下学习


一、行锁的介绍

行锁就是针对数据表中行记录的锁,比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新。并且MySQL的行锁是在各个引擎自己实现的,并不是所有的引擎都支持行锁的,比如MyISAM引擎就不支持行锁。

二、行锁的使用

接下来以一个具体的例子,来展现下行锁,别看先它暴露的问题。
如下对同一张表的操作,开启如下两个事务:
在这里插入图片描述
这两个事务执行的操作结果是,事务B的update语句会被阻塞,直到事务A执行commit之后,事务B才能继续执行,这是因为在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放(两阶段协议锁)。

了解到了行锁使用和释放的节点,接下来我们分析下这样做,使用行锁会引出什么问题

三、使用行锁所带来的问题

接下来我们也是用个具体的例子来展示这个问题。
我们用电影购票这是系统,来展示行锁带来的问题

电影购票的具体操作:

  1. 首先从购票顾客账户余额中扣除电影票价
  2. 给相对于影院的账户余额增加这张电影票价
  3. 记录一条交易日志

从上面执行流程中,我们可以看出这一个需要两次update操作,一次insert操作,并且这三次操作必须在一个事务里。

设想一下,实际购票网站中是会有很多人进行购买,那么就会有很多人购票业务开启,都会对影院账户余额这条记录进行update操作,根据行锁的释放都是在事务提交的时候才释放的,那么就不可避免的造成事务的等待,线程的阻塞
为了解决这个问题,我们看这个购票操作,造成事务等待的原因,就是因为在update影院账户余额造成锁阻塞。为了解决这个问题,我们可以把引起事务阻塞等待的操作放到事务的最后执行,即把对影院余额的更新操作放到事务最后执行的sql语句,这样最大先程度的减少了事务之间的锁等待,提升了并发度

了解了这些之后,接下来我们再才看下使用锁普遍遇到的问题,死锁。接下来我们分析下,MySQL使用行锁,遇到死锁是怎么办的

四、死锁和死锁检测

对操作数据库的表出现死锁现象,接下来我们也是以一个例子进行学习。
如下,对同一表中的相同行开启操作,造成死锁的现象:
在这里插入图片描述
事务A在等待事务B释放id=2的行锁,而事务B在等待事务A释放id=1的行锁。 事务A和事务B在互相等待对方的资源释放,就是进入了死锁状态

MySQL中对于死锁,有两种策略,接下来分别介绍下:

  • 直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout进行设置

意思就是在InnoDB中,innodb_lock_wait_timeout的默认值是50s,当出现死锁以后,第一个被锁住的线程要过50s才会超时退出,然后其他线程才有可能继续执行。默认执行时间如此之长,放到业务中是不现实的,如果把这个时间设置的比较小的,比如1s。又会造成别的问题,比如,如果是真的死锁,可以很快解开没有问题,但是如果不是死锁,而是简单的锁等待呢,设置时间太短的话,会出现很多误伤。所以一般情况下,会采用下面的这种策略:

  • 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑。

主动死锁检测默认本身就是on。主动死锁检测虽然能在发生死锁的时候快速发现并进行处理,但它也是有负担的。
具体执行流程如下:每当一个事务被锁的时候,就要看看它所依赖的线程有没有被别人锁住,如此循环,最后判断是否出现了循环等待,也就是死锁。
知道了这执行流程,一眼边可以看出这一个死锁检测的性能消耗是非常大的,比如有多个并发线程同时更新某一行,那么就要进行大量的死锁检测,消耗大量的CPU资源,就会让我们看到CPU的利用率很高。

那么对于,这更新加锁,然后进行死锁检测导致耗费的大量CPU资源,这种更新导致性能的问题怎么解决呢

  1. 如果确定业务一定不会出现死锁,则可以临时把死锁检测关掉;
  2. 控制并发度也可以,比如可以更改MySQL的操作,对于相同行的更新,可以在进入引擎之前排队,这样在InnoDB内部就不会有大量的死锁检测工作了。像我这样的菜鸡新书,没有能力更改MySQL的操作。这是我们也可以对表、业务进行优化。如我们可以对更新频发的那个行数据,进行拆分成多个行,分摊这个行的压力

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

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

相关文章

切面AOP

1.2 AOP体系与概念 简单地去理解,其实AOP要做三类事: 在哪里切入,也就是权限校验等非业务操作在哪些业务代码中执行。 在什么时候切入,是业务代码执行前还是执行后。 切入后做什么事,比如做权限校验、日志记录等。 因…

ES索引切分

提示:对于一些日志类的数据,我们常用到es作为存储,数据量过大时,可能会用到索引切分,这里可以参考 ES索引切分前言方案一:ES索引切分验证(policy策略)配置ilm策略 (max_d…

照片如何修复清晰度?这些修复方法值得你收藏

我们都知道以前的拍照技术落后,拍摄出来的照片像素都比较低,从而导致照片有些模糊不清,再加上我们保存不当,很多旧照片都变得模糊破损,因此很多人为了不让这些旧照片消失,都会选择找人来修复这些旧照片&…

爬虫 大规模数据 采集心得和示例

本篇主要介绍网站数据很是大的采集心得数据库1. 什么样的数据才能称为数据量大:编程我以为这个可能会由于每一个人的理解不太同样,给出的定义 也不相同。我认为定义一个采集网站的数据大小,不单单要看这个网站包括的数据量的大小,…

MySQL高级【锁】

1:锁的概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、 RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数据库必…

基于java springmvc+mybatis酒水商城管理系统设计和实现

基于java springmvcmybatis酒水商城管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

5.7、TCP 可靠传输的实现

1、TCP基于以字节为单位的滑动窗口来实现可靠传输 TCP 基于以字节为单位的滑动窗口\color{red}以字节为单位的滑动窗口以字节为单位的滑动窗口来实现可靠传输 如下所示,假定数据传输只在一个方向进行 这是发送方待发送字节的序号 假设发送方收到了来自一个接收方的…

RHCE第六天之DNS域名解析服务器详解

文章目录一、 域名解析服务器介绍二、DNS域名解析的过程三、搭建DNS服务器的详细配置四、实验练习一、 域名解析服务器介绍 DNS(Domain Name System) 是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够…

Node转换Excel成JSON

目前想使用Cocos Creator做一个文字游戏,类似于我的人生重开模拟器。 那么其中最重要的一点就是关于数据的存储了。在我的人生重开模拟器中大部分事件和天赋的数据是存储在excel表格当中的,当然如果要使用Cocos Creator,因为我不准备布置服务…

JDBC核心技术_第8章:数据库连接池

目录8.1 JDBC数据库连接池的必要性8.2 数据库连接池技术8.3 多种开源的数据库连接池8.3.1 C3P0数据库连接池8.3.2 DBCP数据库连接池8.3.3 Druid(德鲁伊)数据库连接池8.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模…

【蓝桥杯系列】2020省赛真题之回文日期

⭐️前面的话⭐️ 本篇文章介绍来蓝桥杯真题之回文日期的题解,展示语言java。 📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文由未见花闻原创&#xff0c…

ArcGIS基础实验操作100例--实验81创建点群最小边界几何

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验81 创建点群最小边界几何 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

MySQL是怎么保证高可用的?

在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL 要提供高可用能力…

Python中zipfile压缩包模块的使用

本文主要介绍了Python中zipfile压缩包模块的使用,zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具,本文做一个简单的总结。 简介 ZIP 文件格式是一个常用的归档与压缩标准,zipfile 模块提供了创建、读取、写入、添加及列出 …

如何通过QA质量管理提高软件质量?

1、构建了质量检查系统 为了保证软件开发质量,一般来说QA检查单按照检查阶段划分为:需求分析、系统设计、系统实现、系统测试、交付验收、系统运维。 QA质量管理:CoCode项目管理 QA质量管理——QA检查单​ 为了进一步提高检查效果&…

【笔记:第4课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间:2023年1月10日22:41:26 如题,学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5?p4&vd_source73a25632b4f745be6bbcfe3c82bb7ec0 正文 操作系统:POSIX 标准。 LLVM有…

ArcGIS基础实验操作100例--实验80随机采样统计

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验80 随机采样统计 目录 一、实验背景 二、实验数据 三、实验步骤 (1&…

2022年度总结——一切都在慢慢变好

人生天地之间,若白驹过隙,忽然而已,每个人都希望留下自己的足迹。——题记日月两盏灯,春秋一场梦。回想一年前的现在我在干什么呢?去年的寒假我刚步入大学一个学期,迷茫彷徨,怅然若失&#xff0…

Promise处理异步的并行和串行

一、异步的“并行” 同时处理,相互之间没啥依赖 // 执行FN1返回一个promise实例,实例中管理了一个异步编程的代码,当定时器到时间后,才会把实例的状态改为成功 const fn1 () > {return new Promise(resolve > {setTimeou…

nginx使用!

一:概述 Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京…