数据库死锁
数据库死锁是事务性数据库 (如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
然后再执行查询语句就可以得到结果了。
如果觉得《【MySQL】数据库死锁查询及处理》对你有帮助,请点赞、收藏,并留下你的观点哦!