MySQL进阶篇SQL优化(InnoDB锁问题排查与解决)

Mysql的间隙锁,记录锁,临键锁 聊到mysql的锁,好像就有了一个聊不完的话题。网上一搜感觉各种答案都有,各种方式的描述也有,种类繁多,描述繁琐,反正看来看去,基本最后看多少忘记多少。 mysql 分储存引擎来聊锁。myisam 表锁,innodb行锁、表锁。 行锁: 共享锁(S锁:share):当读取一行记录的时候,为了防止其他人修改,则需要加S锁。 排它锁(X锁:exclusive):当修改一行的记录的时候,为了防止其他人同时修改,则需要添加X锁。 ... 阅读详情

1.概述

前面章节之所以介绍那么多锁的知识点和示例,其实最终目的就是为了排查与解决死锁的问题,下面我们把之前学过锁知识重温与补充一遍,然后再通过例子演示下如果排查与解决死锁。

2.前期准备

●数据库事务隔离级别

SHOW VARIABLES LIKE 'transaction_isolation%';

 

 MYSQL事务隔离级别默认可重复读(如果还不了解事务隔离级别的鞋童们,可以移步到我写这篇文章去了解下)。
●将事务自动提交关闭

SET AUTOCOMMIT=0;

事务自动提交配置:0.事务非自动提交,1.事务自动提交
●创建一个模拟演示用的会员表

CREATE TABLE goods.members (`ID` int NOT NULL AUTO_INCREMENT COMMENT '会员自增ID',`MemberName` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '会员名称',`Tel` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '手机号码',PRIMARY KEY (`ID`));

 在MemberName会员名称字段上建立一个非聚集索引

ALTER TABLE goods.members ADD INDEX IX_MemberName(MemberName);
SHOW INDEX FROM goods.members;

 

往会员表插入四条数据,方便间隙锁跟记录锁例子演示

INSERT INTO goods.members (MemberName,Tel) VALUES ('A','110'),('B','120'),('C','130'),('D','140');

 

SELECT * FROM goods.members;

 

 

好了,前期条件已经准备完毕,在演示之前,下面让我们来重温与补充下锁知识。

3.锁知识重温与补充

3.1锁的介绍

 

 

下面就根据上述图再次重温与补充下之前学习过锁的知识点。

3.2乐观锁与悲观锁

悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念。
●悲观锁(Pessimistic Lock)
悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select...for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。
●乐观锁(Optimistic Lock)
乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳。例如UPDATE SET data = new_data, version = new_version WHERE version = old_version;

3.3共享锁与排他锁

InnoDB存储引擎有主要两种类型的行锁:
●共享锁(S锁):允许持锁事务读取数据行。
●排他锁(X锁):允许持锁事务更新或者删除数据行。
假设事务T1持有R记录行S锁,事务T2请求获取R记录行时,会做如下处理:
◎T2请求S锁会被允许,结果T1,T2都会持有R记录S锁。
◎T2请求X锁不会允许,需要等待T1释放S锁。
同理,假设事务T1持有R记录行X锁,事务T2请求持有R记录行S、X锁时,会做如下处理:
◎T2必须等待T1释放X锁才可以操作R记录行,因为S锁与X锁不兼容。

3.4意向锁

●意向共享锁(IS锁):允许事务获取表数据行的共享锁。
●意向排他锁(IX锁):允许事务获取表数据行的排他锁。
假设事务T1在某表上加了S锁,事务T2想要更改该表R记录行时,要先添加IX锁:
◎由于S锁与IX锁不兼容,所以需要等待T1释放S锁才能更改该表R记录行。
同理,假设事务T1在某表上加了IS锁,事务T2想要更改该表R记录行时,添加了IX锁:
◎由于IS锁与IX锁兼容,所以事务T2可以更改该表R记录行,这样也实现了锁多粒度。
InnoDB存储引擎锁兼容性如下:

 

3.5记录锁(Record Locks)

●它是建立在索引记录上的行锁,会锁住一行记录:SELECT * FROM goods.members WHERE ID=1 FOR UPDATE;
●当一条SQL没有走任何索引时,那么将会在每一条聚集索引后面加X锁,这个类似于表锁,但原理上和表锁应该是完全不同的。
●即使查询的表上没有任何索引,InnoDB也会在后台创建一个隐藏的聚集主键索引并实施记录锁。
●会阻塞其他事务的插入、更新和删除。

RECORD LOCKS space id 51 page no 5 n bits 72 index IX_MemberName of table `goods`.`members` trx id 270900 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
0: len 8; hex 73757072656d756d; asc supremum;;

3.6间隙锁(Gap Locks)

●仅仅锁住一个索引区间(开区间)。其实就是索引项范围内的间隙上锁(在索引记录之间的间隙中加锁,或者是在某一条索引记录之前或者之后加锁,并不包括该索引记录本身),避免幻读。还有间隙锁只会阻止其他事务插入到间隙当中,他们并不阻止其他事务在同一个间隙上获得间隙锁,所以gap x lock和gap s lock有相同的作用。如members表中ID主键间隙范围:(-∞,1),(1,2),(2,3),(3,4), (4,+∞)。示例如下:
事务T1:

SELECT * FROM goods.members WHERE ID>1 AND ID<4 FOR UPDATE;

 

事务T2:

UPDATE goods.members SET Tel='110' WHERE ID IN (1,4);

 

UPDATE goods.members SET Tel='110' WHERE ID IN (2,3);

 

很明显T1在主键ID (2,3)区间加了间隙锁,当T1未释放锁情况下,T2想要更新ID>1 AND ID<4区间范围值时,就会发生阻塞。

3.7临键锁(Next-Key Locks)

●临键锁(Next-Key Locks)其实也是一种特殊间隙锁,是记录锁(Record Locks)和间隙锁(Gap Locks)的组合。Next-Key锁是在下一个索引记录本身和索引之前的间隙加上S锁或是X锁(如果是读就加上S锁,如果是写就加X锁)。

3.8插入意向锁(Insert Intention Locks)

Gap Lock中存在一种插入意向锁(Insert Intention Lock),在insert操作时产生。在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待。
假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。

3.9行锁的兼容矩阵

 

4.死锁

所谓死锁,其实是指多个进程在运行过程中因争夺资源而造成的一种僵持局面,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。如下图所示:


因此我们举个例子来描述,如果此时有一个事务A,先持有锁A,再去获得锁B的情况下,同时又有一个事务B,先持有锁B再去获得锁A的时候就会发生死锁。

 

4.1死锁产生的4个必要条件

●互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
●请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
●不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
●环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,•••,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

4.2死锁示例

演示还是使用goods.members会员表,MemberName会员名称字段为非聚集索引列,清空之前示例数据:

TRUNCATE TABLE goods.members;

 预先插入两条会员数据:

INSERT INTO goods.members (MemberName,Tel) VALUES ('A','110'),('C','130');

 

 事务T1:

UPDATE goods.members SET Tel='130' WHERE MemberName='C';

 

●记录锁:因为MemberName字段是索引,所以该Update语句肯定会加上MemberName='C'的记录锁。
●间隙锁:Update语句会在非唯一索引的MemberName='C'加上左区间的间隙锁(A,C)和右区间的间隙锁(C, +∞)(因为目前goods.members会员表中只有MemberName='C'的一条记录,所以没有中间的间隙锁)。
●Next-Key锁:记录锁(Record Locks)+间隙锁(Gap Locks),说明Update语句同时持有(A,C]Next-Key锁。
事务T2:

UPDATE goods.members SET Tel='110' WHERE MemberName='A';

 

记录锁:因为MemberName字段是索引,所以该Update语句肯定会加上MemberName='A'的记录锁。
●间隙锁:Update语句会在非唯一索引的MemberName='A'加上左区间的间隙锁(-∞,A)(因为目前goods.members会员表中只有MemberName='A'的一条记录,所以没有中间的间隙锁)和右区间的间隙锁(A,C)。
●Next-Key锁:记录锁(Record Locks)+间隙锁(Gap Locks),说明Update语句同时持有(-∞,A]Next-Key锁。
事务T1: 

INSERT INTO goods.members (MemberName,Tel) VALUE ('B','120');

 

 首先是阻塞等待,等T2执行完毕才显示结果!
●间隙锁:因为插入是MemberName=’B’会员信息(B在A和C之间),所以需要请求加(A,C)的间隙锁。
●插入意向锁(Insert Intention):插入意向锁是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号,即事务T1需要插入意向锁(A,C)。
事务T2:

INSERT INTO goods.members (MemberName,Tel) VALUE ('D','140');

 

 间隙锁:因为插入是MemberName=’D’会员信息(D在C之后),所以需要请求加(C,+∞)的间隙锁。
●插入意向锁(Insert Intention):插入意向锁是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号,即事务T2需要插入意向锁(C,+∞)。
事务T1:

等T2执行完毕后,事务T1插入MemberName=’B’的语句就会由阻塞变为死锁!

4.3死锁分析

上面死锁示例我再画了一个表格方便大家更加清晰了解死锁发生过程:

顺序编号

事务T1

事务T2

①

BEGIN;

②

UPDATE goods.members SET Tel='130' WHERE MemberName='C';

持有锁:(A,C]Next-Key锁和(C, +∞)间隙锁。

③

BEGIN;

④

UPDATE goods.members SET Tel='110' WHERE MemberName='A';

持有锁:(-∞,A]Next-Key锁和(A,C)间隙锁。

⑤

INSERT INTO goods.members (MemberName,Tel) VALUE ('B','120');

持有锁:(C, +∞)间隙锁。

等待锁:(A,C)插入意向锁。

⑥

INSERT INTO goods.members (MemberName,Tel) VALUE ('D','140');

持有锁:(A, C)间隙锁。

等待锁:(C, +∞)插入意向锁。

⑦

Deadlock found when trying to get lock; try restarting transaction


然后我们再通过以下语句来查看死锁日志具体分析一下:

-- 查看死锁日志
SHOW ENGINE INNODB STATUS;

日志如下:

------------------------
LATEST DETECTED DEADLOCK
------------------------
2021-08-04 11:39:12 0x7fee8b558700
*** (1) TRANSACTION:
TRANSACTION 271069, ACTIVE 590 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 4 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 1123904, OS thread handle 140662933055232, query id 4785256 localhost root update
INSERT INTO goods.members (MemberName,Tel) VALUE ('B','120')

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 57 page no 5 n bits 72 index IX_MemberName of table `goods`.`members` trx id 271069 lock_mode X
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 1; hex 43; asc C;;
 1: len 4; hex 80000002; asc     ;;

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 57 page no 5 n bits 72 index IX_MemberName of table `goods`.`members` trx id 271069 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 1; hex 43; asc C;;
 1: len 4; hex 80000002; asc     ;;

*** (2) TRANSACTION:
TRANSACTION 271070, ACTIVE 432 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
MySQL thread id 1123909, OS thread handle 140662461384448, query id 4785257 localhost root update
INSERT INTO goods.members (MemberName,Tel) VALUE ('D','140')

*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 57 page no 5 n bits 72 index IX_MemberName of table `goods`.`members` trx id 271070 lock_mode X locks gap before rec
Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 1; hex 43; asc C;;
 1: len 4; hex 80000002; asc     ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 57 page no 5 n bits 72 index IX_MemberName of table `goods`.`members` trx id 271070 lock_mode X insert intention waiting
Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
 0: len 8; hex 73757072656d756d; asc supremum;;

 

4.3.1事务T1日志

●找到最新死锁日志记录,并找到事务T1(271069):

 


●查看事务T1日志执行SQL语句:

 

INSERT INTO goods.members (MemberName,Tel) VALUE ('B','120');

●查看事务T1日志里持有锁(HOLDS THE LOCK):索引(index IX_MemberName),物理记录(PHYSICAL RECORD),间隙区间(未知,+∞)、(未知,C)。

 


●查看事务T1日志正在等待锁释放(WAITING FOR THIS LOCK TO BE GRANTED):插入意向锁(lock_mode X locks gap before rec insert intention waiting),索引上(index IX_MemberName),物理记录(PHYSICAL RECORD),间隙区间(未知,C)。

 

4.3.2事务T2日志

●然后找到事务T2(271070):


●查看事务T2日志执行SQL语句:

INSERT INTO goods.members (MemberName,Tel) VALUE ('D','140');

 

查看事务T2日志里持有锁(HOLDS THE LOCK):索引(index IX_MemberName),间隙锁(lock_mode X locks gap before rec),物理记录(PHYSICAL RECORD),间隙区间(未知,C)。

 


●查看事务T2日志正在等待锁释放(WAITING FOR THIS LOCK TO BE GRANTED):插入意向锁(lock_mode X locks gap before rec insert intention waiting),索引上(index IX_MemberName),物理记录(PHYSICAL RECORD),间隙区间(未知,+∞)。

 

4.3.3查看日志总结

●事务T1正在等待的插入意向排他锁,刚好正在事务T2的怀里。
●事务T2持有间隙锁,正在等待插入意向排它锁。

4.4总结

●事务T1执行完Update MemberName='C'语句,持有(A,C]Next-Key锁和(C, +∞)间隙锁。
●事务T2执行完Update MemberName='A'语句,持有(-∞,A]Next-Key锁和(A,C)间隙锁。
●事务T1执行Insert MemberName='B'的语句时,因为需要(A,C)插入意向锁,但是(A,C)在事务T2里面未释放,所以T1继续等待。
●事务T2执行Insert MemberName='D'的语句时,因为需要(C, +∞) 插入意向锁,但是(C, +∞) 在事务T1里面未释放,所以T2继续等待。
●事务T1持有(C, +∞)间隙锁,在等待(A,C)的插入意向锁,事务T2持有(A,C)间隙锁,在等待(C, +∞)的插入意向锁,所以形成了死锁的闭环(间隙锁与插入意向锁会冲突的,可以看回行锁的兼容矩阵)。
●事务T1,T2形成了死锁闭环后,因为InnoDB的底层机制,它会让其中一个事务让出资源,让另外的事务执行成功,这就是为什么你最后看到了事务T2插入成功,而事务T1的插入最后由阻塞显示为Deadlock found when trying to get lock; try restarting transaction。
注:查询锁信息(MySQL8.0版本):SELECT * FROM `performance_schema`.data_locks;

mysql死锁分析 环境准备 数据库隔离级别: mysql> select @@tx_isolation; +-----------------+ | @@tx_isolation | +-----------------+ | REPEATABLE-READ | +-----------------+ 1 row in set, 1 warning (0.00 sec) 复制代码 自动提交关闭: mysql> set autocommit=0; Query OK, 0 rows affected ( 阅读详情

相关推荐

【第27天】MYSQL进阶-查询优化- performance_schema系列实战三:锁问题排查(表级锁)(SQL 小虚竹)

SQL进阶-查询优化- performance_schema系列实战三:锁问题排查(表级锁)

小虚竹的专栏 1万+

Java高级工程师必备知识!为什么你的insert就死锁了

A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record. By default, InnoDB operates in REPEATABLE READ transaction isolation level and with the innodb_locks_unsafe_for_binlog system variable.

m0_56144365的博客 849

密码学:一文看懂Base64算法

Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励!

Shujie 1万+

MySQL 死锁问题排查与分析

在数据库管理系统中,死锁是一个常见且棘手的问题。当两个或多个事务相互等待对方释放资源时,就会发生死锁,导致事务无法继续执行,严重时甚至会影响整个系统的稳定性。MySQL作为广泛使用的关系型数据库管理系统,也不例外。本文将详细介绍在遇到MySQL死锁问题时,如何进行排查和分析,帮助读者快速定位问题并采取有效措施解决死锁问题。 1. 死锁的基本概念 1.1 死锁的定义 死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种僵持状态,若无外力作用,这些事务将无法继续执行。 1.2 死锁的四个必要条件

My_wife_QBL的博客 6250

复合材料RVE建模与力学性能分析实战指南

代表体积元(RVE)建模是复合材料多尺度分析的核心技术,通过建立微观结构与宏观性能的定量关联,可准确预测材料力学行为。本文基于ABAQUS平台,详细解析三材料(纤维/基体/界面相)RVE建模全流程,包括参数化几何建模、周期性网格划分策略、材料属性定义技巧等关键技术环节。针对碳纤维增强环氧树脂等典型复合材料,提供网格控制参数建议和材料参数参考表,并重点说明周期性边界条件的实现方法与验证标准。通过Python脚本自动化处理和优化分析流程,可显著提升计算效率,为复合材料设计提供可靠仿真依据。

weixin_34062469的博客 549

【保姆级教程/代码】GNSS反演大气可降水量(Precipitable Water Vapor, PWV)

GPS精密单点定位(PPP)是一种采用精密卫星星历和卫星钟差进行非差单点定位的方法,在观测过程中采用双频载波相位观测法以确保高精度定位精度。本文利用PPP技术来求解天顶对流层延迟(zenith tropospheric delay,ZTD)。ZTD由湿延迟(ZWD)和干延迟(ZHD)组成,其中占比90%的ZHD与地面测站高程、大气压和测站纬度等参数有良好的相关性,可以通过Saastamoinen模型精确求出;

weixin_43910227的博客 2926

MySQL Innodb引擎锁的分类及死锁排查

共享锁、排它锁、表级锁、行级锁、记录锁、间隙锁、临键锁、插入意向锁、自增锁概念解析; 处理Deadlock found when trying to get lock; try restarting transaction问题

Gzf的博客 1805

模拟量传输4-20ma电流

大家可能会非常熟悉RS232,RS485,CAN等工业上常用的总线,他们都是传输数字信号的方式。那么,我们用什么方式来传输模拟信号呢?工业上普遍需要测量各类非电物理量,例如温度、压力、速度、角度等,这些都需要转换成模拟量电信号才能传输到几百米外的控制室或显示设备上。工业上最广泛采用的是用4~20mA电流来传输模拟量。 采用电流信号的原因是不容易受干扰,因为工业现场的噪声电压的幅度可能达到数V,但是噪声的功率很弱,所以噪声电流通常小于nA级别,因此给4-20mA传输带来的误差非常小;电流源内阻趋于无穷.

tangdongming的博客 1万+

MySQL性能优化与问题排查实战指南

MySQL性能优化是一个系统工程,需要从SQL语句、索引设计、参数配置、硬件资源等多个维度综合考虑。本文介绍的方法和技巧大多经过生产环境验证,但每个系统都有其独特性,建议在实施前充分测试。记住,最好的优化往往来自对业务逻辑和查询模式的深入理解,而非盲目的参数调整。

Tony_Tina1314的博客 1293

信道估计准则演进:从LS、MMSE到LMMSE的工程权衡

本文深入探讨了信道估计准则的演进历程,从LS、MMSE到LMMSE的工程权衡。通过对比分析三大经典算法的数学本质、工程实现及适用场景,揭示了在计算复杂度、实时性和性能之间的关键取舍。文章结合4G/5G基站项目实战经验,提供了算法选型的三维决策模型和前沿发展建议,为无线通信系统设计提供实用指导。

weixin_29327525的博客 282

LPDDR6来了!到底比LPDDR5/5X强在哪?从速度到总线,技术细节一次说清!

LPDDR6不仅仅是速度快点、位宽大点那么简单,它是一次架构级的革新,从引脚、总线、时钟管理到Burst协议全部升级。🎯我们正在迈入一个“AI优先”的时代,内存架构也必须跟上。对于做芯片、做整机、做系统的你,理解LPDDR6的技术变化,提前规划测试方案,是现在就该启动的动作!

weixin_43199439的博客 1284

Mysql - InnoDB 锁等待,死锁的排查语句

Mysql,InnoDB中锁等待,死锁的排查方法

单曲_Groot的博客 1340

第38节:cesium 风场效果(含源码+视频)

cesium 风场效果

qq_29384639的博客 2330

5分钟定位MySQL锁等待:从死锁排查到解决的完整指南

MySQL锁等待是数据库运维中常见的性能问题,尤其是在高并发场景下,锁冲突可能导致业务停滞甚至系统崩溃。本文将带你快速掌握MySQL锁等待的定位方法和解决技巧,通过实战案例和工具分析,帮助你在5分钟内定位并解决锁等待问题。 ## 一、快速识别锁等待:3个关键信号 当业务出现以下情况时,可能正在遭遇MySQL锁等待: 1. **查询长时间无响应**:简单SQL执行时间突然变长,超过正常阈值 2

gitblog_00864的博客 723

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数据库死锁问题的排查与解决

数据库死锁是一种特殊的并发问题,指两个或多个事务在并发操作时,因相互等待对方释放资源(如锁)而无法继续进行,导致这组事务永远处于等待状态。死锁可能会导致数据库中的事务超时,无法完成。

lssffy的博客 7928

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MySQL死锁类deadlock问题排查

详解MySQL InnoDB死锁排查利器SHOW ENGINE INNODB STATUS与永久日志配置innodb_print_all_deadlocks,手把手教你快速捕获、解读死锁现场,定位事务SQL与锁等待循环,提供可落地的优化模板与紧急应对策略,助你彻底消灭死锁性能隐患。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 1384

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

MySQL数据库查看是否锁表以及如何解决

近期系统在使用过程中总是出现数据库锁表情况,导致页面报错,经过排查,是由于系统在跑定时任务;将解决过程以及在以后开发过程中该怎样注意,做个总结,避免以后在出现;

似水流年,是谁苍白了等待 3万+

MySQL锁机制的核心问题场景、线上排查以及解决方案

MySQL 锁机制是保证数据并发访问一致性的核心,但在生产环境中容易引发死锁、锁等待、锁冲突等问题。本文分析了六大核心锁问题:死锁、锁等待超时、锁竞争、行锁升级表锁、幻读和间隙锁阻塞,并提供了具体场景示例。针对死锁问题,重点介绍了跨事务加锁顺序不一致的典型场景,以及通过show engine innodb status排查死锁日志的方法。解决方案包括规范加锁顺序、缩短事务生命周期、捕获死锁异常重试等技术手段。对于锁等待超时问题,分析了长事务、慢SQL等典型场景,并提供了排查思路。

he_co的博客 1207
上一篇: 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗?
下一篇: Java 下数据业务逻辑开发技术 JOOQ 和 SPL
java_lujj
博客等级 码龄4年 18粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值