MySQL锁机制详解及死锁处理方式

SRA数据下载的一个坑 SRA数据真坑啊! 阅读详情

为了给高并发情况下的MySQL进行更好的优化,有必要了解一下MySQL查询更新时的锁表机制。

一、概述
MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level
locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

二、MyISAM表锁
MyISAM存储引擎只支持表锁,是现在用得最多的存储引擎。
但表级锁让多线程可以同时从数据表中读取数据,但是如果另一个线程想要写数据的话,就必须要先取得排他访问。正在更新数据时,必须要等到更新完成了,其他线程才能访问这个表。(这种机制造成了并发读写容易出现表锁争夺而导致阻塞访问)
1、查询表级锁争用情况
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
mysql> show status like ‘table%’;
+———————–+———-+
| Variable_name | Value |
+———————–+———-+
| Table_locks_immediate | 76939364 | (表示可以立即获取锁的次数)
| Table_locks_waited | 305089 | (表示不能立即获取锁,需要等待锁的次数;)
+———————–+———-+
2 rows in set (0.00 sec)
Table_locks_waited/(Table_locks_immediate+Table_locks_waited)
这个比例值越大说明表级锁争用的情况越严重。
例:比例值=0.01说明100次进程里就有一次是需要等待锁的进程;

2、MySQL表级锁的锁模式
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write
Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

3、并发插入
原则上数据表有一个读锁时,其它进程无法对此表进行更新操作,但在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
a、当concurrent_insert设置为0时,不允许并发插入。
b、当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
c、当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。
4、MyISAM的锁调度
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
我们可以通过一些设置来调节MyISAM的调度行为:
a、通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
b、通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。
c、通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
上面3种方法都是要么更新优先,要么查询优先的方法。这里要说明的就是,不要盲目的给mysql设置为读优先,因为一些需要长时间运行的查询操作,也会使写进程“饿死”。只有根据你的实际情况,来决定设置哪种操作优先。
这些方法还是没有从根本上同时解决查询和更新的问题。在一个有大数据量高并发表的mysql里,我们还可采用另一种策略来进行优化,那就是通过mysql主从(读写)分离来实现负载均衡,这样可避免优先哪一种操作从而可能导致另一种操作的堵塞。下面将用一个篇幅来说明mysql的读写分离技术。

MyISAM使用的是 flock 类的函数,直接就是对整个文件进行锁定(叫做文件锁定),InnoDB使用的是 fcntl 类的函数,可以对文件中局部数据进行锁定(叫做行锁定),所以区别就是在这里。
另外MyISAM的数据表是按照单个文件存储的,可以针对单个表文件进行锁定,但是InnoDB是一整个文件,把索引、数据、结构全部保存在 ibdata 文件里,所以必须用行锁定。
死锁
所谓死锁: 是指两个或两个以上的进程在执行过程中,
因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.
表级锁不会产生死锁.所以解决死锁主要还是真对于最常用的InnoDB.
遇到死锁的处理方式

mysql -uxxx -pxxx -h服务器ip –port=服务器端口;(如果服务器设置了ip和端口访问的话,一定要带ip和端口)

mysql> show processlist; #查看正在执行的sql (show full processlist;查看全部sql)
mysql> kill id #杀死sql进程;
如果进程太多找不到,就重启mysql吧
/ect/init.d/mysql restart
或/ect/init.d/mysql stop(如果关不掉就直接kill -9 进程id) 再/ect/init.d/mysql start
去看看mysql日志文件是否保存死锁日志:
常用目录:/var/log/mysqld.log;(该目录还有其它相关日志文件就都看看)
转载网址:http://www.linuxidc.com/Linux/2015-05/116912.htm

PCIe-Orders set Blocks之symbol对齐 有序集的使用场合很多,如在链路link阶段,进入polling后,便开始有序集的发送。一个 Ordered Set Block 包含一个同步头,后跟一个有序集。多通道链路的所有 Lane 必须同时传输相同的有序集,而且有序集的第一个符号定义了有序集的类型。但在PCIE中,8GT/s及以上的速率,采用的是128b/130b编码。128-bit是想要传输的payload,实际会传输130-bit,多出来的2-bit就是sync header。Block有两种,通过Sync header区分:10b:表示data 阅读详情

相关推荐

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 375

【MySQL锁篇】MySQL死锁问题以及解决方案

mysql死锁及其解决办法

weixin_56738054的博客 1万+

散户逆袭神器:用通达信DIY指数发现下一个光伏储能(附龙头股筛选模板)

本文详细介绍了如何利用通达信软件的自定义指数功能,构建个人专属的行业监控工具,以发现类似光伏储能这样的潜力赛道。文章提供了从零开始的指数编制步骤、核心的龙头股筛选模板,以及五个关键的数据校验技巧,帮助散户投资者实现机构级的行业分析与机会挖掘,有效提升投资决策能力。

w3x4y的博客 485

MySQL死锁了怎么办(死锁的产生及解决方案),死锁的案例,死锁的排查,死锁的解决,如何避免死锁的发生

死锁是指2+的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

weixin_44797327的博客 1万+

数学建模传染病模型_【数学建模】之传染病模型

点击【拇指笔记】,关注我的公众号。SE模型缺点:没有考虑接触到的人中还有一部分病人,所以所有人并不会全部被感染。建立模型:已感染人数(病人)每个病人每天有效接触(足以使人致病)人数为根据(1)(2)可以建立模型:等式两边同时除以\Delta t由导数定义有同时,取\Delta t = 1天由(1)(5)两式可得最终的模型:Logistic模型缺点:区分已感染者(病人)和未感染者(健康人)...

weixin_39590453的博客 2228

利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记

前言 前面我学习了利用DTI构建白质纤维脑网络,并采用GRETNA计算了小世界网络属性。阅读文献发现可以利用灰质体积或皮层指标(皮层厚度、折叠指数、沟深)等构建结构协变网络再进行网络拓扑属性的计算。因此,我采用前面提取的灰质体积和皮质数据进行了结构协变网络分析,特此写下笔记以便后面的学习。 一、数据准备 二、构建结构协变网络 三、全局属性的统计分析 四、局部属性的统计分析 五、网络攻击分析 六、度的分布 ..................

weixin_52073820的博客 7498

mysql死锁介绍以及解决

众所周知,数据库的连接资源是很珍贵的,如果一个连接因为事务阻塞长时间不释放,那么后面新的请求要执行的sql也会排队等待,越积越多,最终会拖垮整个应用。一旦你的应用部署在微服务体系中而又没有做熔断处理,由于整个链路被阻断,那么就会引发雪崩效应,导致很严重的生产事故。

qq_37436172的博客 1万+

嵌入式NuttX RTOS面试题及参考答案

NuttX 的板级支持包(BSP)是一组软件组件,用于将 NuttX 操作系统适配到特定的硬件平台上。BSP 提供了硬件抽象层,使得 NuttX 能够与硬件进行交互,包括初始化硬件设备、提供设备驱动程序等。BSP 的主要作用是隐藏硬件细节,为上层应用程序和操作系统内核提供统一的接口,从而提高软件的可移植性和可维护性。开发 NuttX 的 BSP 通常需要以下步骤:硬件分析:首先需要对目标硬件平台进行详细的分析,了解硬件的架构、处理器类型、外设接口等信息。

大模型大数据攻城狮的专栏 1306

MySQL死锁产生的原因和解决方法

上面是老顾总结的mysql死锁相关的内容,尤其是死锁检查处理,是比较实用的,小伙伴们可以参考。推荐阅读解决Api统一格式返回,遗留地返回String一个问题SpringMVC全局异常方案、源码分析,以及常见的入坑Spring多种启动初始化方案,看这篇就够了来说说ThreadLocal内存溢出问题阿里面试题:强、软、弱、虚引用的特点及应用场景企业常用的并发编程Queue的源码分析了解JAVA中的SPI机制,以及数据库驱动插件,这一篇就够了企业实战之阿里druid统一监控方案,你了解吗?

java1527的博客 2万+

基于STM32单片机设计的红外人脸测温仪(QT上位机)

基于STM32单片机设计的红外人脸测温仪(QT上位机)是一种结合红外测温和人脸识别技术的设备,可以快速、非接触地测量人体体温并识别身份,广泛应用于人员密集场所的体温筛查和出入管理。基于STM32单片机设计的红外人脸测温仪是一种功能实用、易于使用的人脸测温设备,可以有效提高测温效率和识别准确率,广泛应用于各类人员密集场所的体温筛查和出入管理。

走向CTO的路上... 1720

手把手教你学Simulink——基于Simulink的蚁群算法路径规划仿真建模示例

路径规划是机器人导航系统中的核心任务之一,旨在为机器人找到一条安全且高效的路径,使其能够从起点到达目标点,同时避免与障碍物发生碰撞。在开始之前,需要定义工作环境(例如地图),包括起点、终点以及可能存在的障碍物位置。通过本指南,我们介绍了如何基于Simulink结合MATLAB实现蚁群算法的路径规划仿真建模。

MHD0815的博客 223

炸裂:MySQL死锁是什么,如何解决?

死锁是指两个或多个事务在执行过程中,因争夺锁资源而造成的相互等待的现象,若无外力干涉它们都将无法继续执行。通俗来说,就是两个或多个事务在等待对方释放锁,从而造成僵持不下,使得整个系统陷入停滞状态。什么是死锁DeadLock?是指两个或两个以上的进程在执行过程中, 因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。假设有两个事务 A 和 B,它们同时试图获取对方持有的资源,但又都在等待对方释放资源。

架构师尼恩 4025

S速度曲线轨迹规划(普通变频位置闭环控制算法详细介绍+SCL代码)

位置控制用PD控制器,详细内容介绍请查看下面博客文章:PD控制器算法详细解读_RXXW_Dor的博客-优快云博客鉴于积分和微分在工程上的大量应用,这篇博文主要讲解工程上的如何求导f'(x),导数反映的是函数(信号)的变化率,牛顿也是在研究运动的时候提出了微积分的概念,我们知道反映位移变化的快慢程度是速度v(t),反映速度变化快慢程度的物理量是加速度(速度的变化率)。

RXXW_Dor的博客 3890

mysql锁机制详解及死锁处理方式

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。一、概述MySQL有三种锁的级别:页级、表级、行级。 MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行...

weixin_33826609的博客 96

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

MySQL 锁机制详解

MySQL 锁机制详解

m0_54258715的博客 1195

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Mysql锁机制之死锁问题

一.死锁问题 MyISAM中是不会产生死锁的,因为MyISAM总是一次性获得所需的全部锁,要么全部满足,要么全部等待。而在InnoDB中,锁是逐步获得的,就造成了死锁的可能 1.死锁问题一 ( 两个会话, 两条 SQL语句产生死锁) 准备工作 create index index_id on t01; # 删除之前的索引 alter table t01 modify id int primary ket; # 将id字段设置成主键 create index index_id on t01(id);

Shawn派大星 535

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Mysql 之 事务与锁机制原理

原子性(Atomicity):事务是不可分割的工作单位,要么全部执行成功,要么全部失败回滚一致性(Consistency):事务执行前后,数据库从一个一致状态变为另一个一致状态隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务持久性(Durability):事务一旦提交,其结果就是永久性的。

yyyyyyyh的博客 1018

MySQL 的锁机制

锁的核心目标是解决并发事务中的资源竞争问题,防止数据不一致。InnoDB 是 MySQL 默认支持事务的存储引擎,其锁机制最为复杂和常用。通过合理使用锁机制,可以在高并发场景下平衡数据一致性和系统性能。用途:禁止其他事务读(取决于隔离级别)或修改。两个或多个事务互相等待对方释放锁,形成循环依赖。用途:允许其他事务读,但禁止修改或加排他锁。​:快速判断表级锁是否冲突,避免逐行检查。或 DML 语句(如。

不辉放弃的博客 1224

【MySQL】锁机制详解

本文系统讲解了MySQL锁机制,从概念、分类到实现原理,重点分析了行锁与表锁的区别及应用场景。详细介绍了InnoDB的行锁实现方式(记录锁、间隙锁、临键锁)和死锁处理策略,并提供了高并发优化方案,包括使用MVCC、创建索引、缩短事务等。最后总结了面试常见考点,帮助开发者深入理解锁机制,优化数据库并发性能,解决死锁问题。

2301_81481532的博客 611

mysql锁机制与结构

mysql锁机制与结构目录一、锁的基础与行锁的特点1. 概念2. 锁特性3. 锁类型3.1 表级锁3.2 页级锁3.3 行级锁3.3.1 行级锁类型排它锁共享锁4. 总结二、死锁的产生于处理1. 死锁简介2. 死锁产生的原因3. 解决办法4. 避免死锁三、乐观锁与悲观锁1. 乐观锁1.1 MVCC-乐观锁的解释2. 悲观锁四、间隙锁与行锁升级表锁1. 间隙锁1.1 概念1.2 危害2. 行锁升级表锁2.1 为什么行锁会升级表锁的原因2.2 如何避免 一、锁的基础与行锁的特点 1. 概念 1. 在开发多用户、

Rosemaryyuyu的博客 378
上一篇: 理解MySQL——架构与概念
下一篇: MySQL 加锁处理分析
我爱默小兜
博客等级 码龄14年 387粉丝 266原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值