• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

MYSQL死锁相关查找_MySQL

mysql 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论

gaodaima.com

MYSQL死锁相关查找

如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。

我们来演示下。

线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。

[sql]  mysql> set @@autocommit=0;  Query OK, 0 rows affected (0.00 sec)      mysql> use test;  Reading table information for completion of table and column names  You can turn off this feature to get a quicker startup with -A      Database changed  mysql> show tables;  +----------------+  | Tables_in_test |  +----------------+  | demo_test      |  | t3             |  +----------------+  2 rows in set (0.00 sec)      mysql> select * from t3;  +----+--------+--------+------------+----+----+----+  | 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 |  +----+--------+--------+------------+----+----+----+  2 rows in set (0.00 sec)      mysql> update t3 set birthday = '2022-02-23' where id = 19;  Query OK, 1 row affected (0.00 sec)  Rows matched: 1  Changed: 1  Warnings: 0      mysql> select connection_id();  +-----------------+  | connection_id() |  +-----------------+  |              16 |  +-----------------+  1 row in set (0.00 sec)      mysql>   

线程B, 我们用来进行普通的更新,但是遇到问题了,此时不知道是哪个线程把这行记录给锁定了?

[sql]  mysql> use test;  Reading table information for completion of table and column names  You can turn off this feature to get a quicker startup with -A      Database changed  mysql> select @@autocommit;  +--------------+  | @@autocommit |  +--------------+  |            1 |  +--------------+  1 row in set (0.00 sec)      mysql> update t3 set birthday='2018-01-03' where id = 19;  ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction  mysql> select connection_id();  +-----------------+  | connection_id() |  +-----------------+  |              17 |  +-----------------+  1 row in set (0.00 sec)      mysql> show processlist;  +----+------+-----------+------+---------+------+-------+------------------+  | 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  | show processlist |  | 18 | root | localhos<mark>本文来源gaodaimacom搞#^代%!码&网(</mark>t | NULL | Sleep   |    5 |       | NULL             |  +----+------+-----------+------+---------+------+-------+------------------+  5 rows in set (0.00 sec)      mysql> show engine innodb status/G          ------------  TRANSACTIONS  ------------  Trx id counter 189327  Purge done for trx's n:o < 189323 undo n:o = 189325, sees < 189325  

上面的信息很繁多,也看不清楚到底哪里是哪里。

不过现在,我们只要从数据字典里面拿出来这部分信息就OK了。

[sql]  mysql> SELECT * FROM information_schema.INNODB_TRX/G  *************************** 1. row ***************************                      trx_id: 189324                   trx_state: RUNNING                 trx_started: 2013-04-18 17: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: REPEATABLE READ           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  1 row in set (0.01 sec)      mysql>   

gaodaima.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MYSQL死锁相关查找_MySQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址