如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。我们来演示下。线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。
-
mysql>set@@autocommit=0;
-
QueryOK,0rowsaffected(0.00sec)
-
-
-
mysql>usetest;
-
Readingtableinformationforcompletionoftableandcolumnnames
-
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
-
-
-
Databasechanged
-
mysql>showtables;
-
+
-
|Tables_in_test|
-
+
-
|demo_test|
-
|t3|
-
+
-
2rowsinset(0.00sec)
-
-
-
mysql>select*fromt3;
-
+
-
|id|fname|lname|birthday|c1|c2|c3|
-
+
-
|19|lily19|lucy19|2013-04-18|19|0|0|
-
|20|lily20|lucy20|2013-03-13|20|0|0|
-
+
-
2rowsinset(0.00sec)
-
-
-
mysql>updatet3setbirthday='2022-02-23'whereid=19;
-
QueryOK,1rowaffected(0.00sec)
-
Rowsmatched:1Changed:1Warnings:0
-
-
-
mysql>selectconnection_id();
-
+
-
|connection_id()|
-
+
-
|16|
-
+
-
1rowinset(0.00sec)
-
-
-
mysql>
线程B, 我们用来进行普通的更新,但是遇到问题了,此时不知道是哪个线程把这行记录给锁定了?
-
mysql>usetest;
-
Readingtableinformationforcompletionoftableandcolumnnames
-
Youcanturnoffthisfeaturetogetaquickerstartupwith-A
-
-
-
Databasechanged
-
mysql>select@@autocommit;
-
+
-
|@@autocommit|
-
+
-
|1|
-
+
-
1rowinset(0.00sec)
-
-
-
mysql>updatet3setbirthday='2018-01-03'whereid=19;
-
ERROR1205(HY000):Lockwaittimeoutexceeded;tryrestartingtransaction
-
mysql>selectconnection_id();
-
+
-
|connection_id()|
-
+
-
|17|
-
+
-
1rowinset(0.00sec)
-
-
-
mysql>showprocesslist;
-
+
-
|Id|User|Host|db|Command|Time|State|Info|
-
+
-
|10|root|localhost|NULL|Sleep|1540||NULL|
-
|11|root|localhost|NULL|Sleep|722||NULL|
-
|16|root|localhost|test|Sleep|424||NULL|
-
|17|root|localhost|test|Query|0|init|showprocesslist|
-
|18|root|localhost|NULL|Sleep|5||NULL|
-
+
-
5rowsinset(0.00sec)
-
-
-
mysql>showengineinnodbstatus\G
-
-
-
-
-
-
TRANSACTIONS
-
-
Trxidcounter189327
-
Purgedonefortrx'sn:o<189323undon:o<0state:runningbutidle
-
Historylistlength343
-
LISTOFTRANSACTIONSFOREACHSESSION:
-
-
MySQLthreadid11,OSthreadhandle0x7f70a0c98700,queryid994localhostrootinit
-
showengineinnodbstatus
-
-
mysqltablesinuse1,locked1
-
LOCKWAIT2lockstruct(s),heapsize376,1rowlock(s)
-
MySQLthreadid17,OSthreadhandle0x7f70a0bd5700,queryid993localhostrootupdating
-
updatet3setbirthday='2018-01-03'whereid=19
-
-
RECORDLOCKSspaceid529pageno3nbits72index`PRIMARY`oftable`test`.`t3`trxid189326lock_modeXwaiting
-
Recordlock,heapno2PHYSICALRECORD:n_fields9;compactformat;infobits0
-
0:len2;hex3139;asc19;;
-
1:len6;hex00000002e38c;asc;;
-
2:len7;hex7e00000d2827c9;asc~(';;
-
3:len6;hex6c696c793139;asclily19;;
-
4:len6;hex6c7563793139;asclucy19;;
-
5:len3;hex8fcc57;ascW;;
-
6:len4;hex80000013;asc;;
-
7:len4;hex80000000;asc;;
-
8:len4;hex80000000;asc;;
-
-
-
-
-
2lockstruct(s),heapsize376,3rowlock(s),undologentries1
-
MySQLthreadid16,OSthreadhandle0x7f70a0b94700,queryid985localhostrootcleaningup
-
Trxreadviewwillnotseetrxwithid>=189325,sees<189325
上面的信息很繁多,也看不清楚到底哪里是哪里。不过现在,我们只要从数据字典里面拿出来这部分信息就OK了。
-
mysql>SELECT*FROMinformation_schema.INNODB_TRX\G
-
***************************1.row***************************
-
trx_id:189324
-
trx_state:RUNNING
-
trx_started:2013-04-1817:48:14
-
trx_requested_lock_id:NULL
-
trx_wait_started:NULL
-
trx_weight:3
-
trx_mysql_thread_id:16
-
trx_query:NULL
-
trx_operation_state:NULL
-
trx_tables_in_use:0
-
trx_tables_locked:0
-
trx_lock_structs:2
-
trx_lock_memory_bytes:376
-
trx_rows_locked:3
-
trx_rows_modified:1
-
trx_concurrency_tickets:0
-
trx_isolation_level:REPEATABLEREAD
-
trx_unique_checks:1
-
trx_foreign_key_checks:1
-
trx_last_foreign_key_error:NULL
-
trx_adaptive_hash_latched:0
-
trx_adaptive_hash_timeout:10000
-
trx_is_read_only:0
-
trx_autocommit_non_locking:0
-
1rowinset(0.01sec)
-
-
-
mysql>
原来是线程16忘掉COMMIT了。
分享到:
相关推荐
找到原始的锁ID,然后KILL掉一直持有的那个线程可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。 我们来演示下。 ...
mysql死锁解决
docker mysql_一些常见的mysql死锁案例_笔记记录
mysql死锁检测机制初探1
mysql死锁分析
这六个 MySQL 死锁案例,能让你理解死锁的原因!.doc
1.1 一个不可思议的死锁 1 1.1.1 初步分析 3 1.2 如何阅读死锁日志 3 2.1 Delete操作的加锁逻辑 4 2.2 死锁预防策略 5 2.3
NULL 博文链接:https://fs20041242.iteye.com/blog/1732749
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; show status like ‘%lock%’等语句排查详解
前段时间遇到了一个Mysql 死锁相关的问题,整理一下。 问题描述:Mysql 的修改语句似乎都没有生效,同时使用Mysql GUI 工具编辑字段的值时会弹出异常。 什么是死锁 在解决Mysql 死锁的问题之前,还是先来了解一下...
大牛出手MySQL死锁深入分析,关于死锁是工作与面试经常遇到的。
这个项目收集了一些常见的 MySQL 死锁案例,大多数案例都来源于网络,并对其进行分类汇总,试图通过死锁日志分析出每种死锁的原因,还原出死锁现场。 实际上,我们在定位死锁问题时,不仅应该对死锁日志进行分析,...
找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。 我们来演示下。 线程A,...
主要给大家实例分析了一个mysql死锁场景的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
MySQL死锁1
解决mysql死锁问题,类似问题多为后台代码造成,所以底层源码的开发是需要项目经理好好把关的
避免或最小化mysql死锁deadlock一些方法.docx
在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁...