【MySQL】数据库死锁查询及处理

数据库死锁

数据库死锁是事务性数据库 (如SQL Server, MySql等)经常遇到的问题。除非数据库死锁问题频繁出现导致用户无法操作,一般情况下数据库死锁问题不严重。在应用程序中进行try-catch就可以。那么数据死锁是如何产生的呢?

InnoDB实现的是行锁 (row level lock),分为共享锁 (S) 和 互斥锁 (X)。

共享锁用于事务read一行。
互斥锁用于事务update或delete一行。
当客户A持有共享锁S,并请求互斥锁X;同时客户B持有互斥锁X,并请求共享锁S。以上情况,会发生数据库死锁。

常见的死锁原因

?有可能是因为上一个测试没有commit导致死锁
?有可能是连接池配置不合理

构建一个死锁进程

BEGIN TRANSACTION--开始事务
update T_Users set UserName='00000' where UserId='123'
WAITFOR DELAY '01:00'; --指定1点执行 

执行查询语句:

select * from T_Users where UserId='123'

这时会发现一直在执行查询,得不到查询结果,这是死锁现象

显示哪些线程正在运行

SHOW PROCESSLIST

在这里插入图片描述

结束某个线程

kill 53

然后再执行查询语句就可以得到结果了。

发布了552 篇原创文章 · 获赞 201 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/103587585