首页 数据库 mysql教程 MYSQL死锁相关查找_MySQL

MYSQL死锁相关查找_MySQL

Jun 01, 2016 pm 01:29 PM
多线程

bitsCN.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=&#39;2018-01-03&#39; 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 | localhost | 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&#39;s n:o < 189323 undo n:o < 0 state: running but idle  History list length 343  LIST OF TRANSACTIONS FOR EACH SESSION:  ---TRANSACTION 0, not started  MySQL thread id 11, OS thread handle 0x7f70a0c98700, query id 994 localhost root init  show engine innodb status  ---TRANSACTION 189326, ACTIVE 2 sec starting index read  mysql tables in use 1, locked 1  LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)  MySQL thread id 17, OS thread handle 0x7f70a0bd5700, query id 993 localhost root updating  update t3 set birthday=&#39;2018-01-03&#39; where id = 19  ------- TRX HAS BEEN WAITING 2 SEC FOR THIS LOCK TO BE GRANTED:  RECORD LOCKS space id 529 page no 3 n bits 72 index `PRIMARY` of table `test`.`t3` trx id 189326 lock_mode X waiting  Record lock, heap no 2 PHYSICAL RECORD: n_fields 9; compact format; info bits 0   0: len 2; hex 3139; asc 19;;   1: len 6; hex 00000002e38c; asc       ;;   2: len 7; hex 7e00000d2827c9; asc ~   (&#39; ;;   3: len 6; hex 6c696c793139; asc lily19;;   4: len 6; hex 6c7563793139; asc lucy19;;   5: len 3; hex 8fcc57; asc   W;;   6: len 4; hex 80000013; asc     ;;   7: len 4; hex 80000000; asc     ;;   8: len 4; hex 80000000; asc     ;;      ------------------  ---TRANSACTION 189324, ACTIVE 641 sec  2 lock struct(s), heap size 376, 3 row lock(s), undo log entries 1  MySQL thread id 16, OS thread handle 0x7f70a0b94700, query id 985 localhost root cleaning up  Trx read view will not see trx with id >= 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>   
登录后复制

 


bitsCN.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

C++ 函数异常与多线程:并发环境下的错误处理 C++ 函数异常与多线程:并发环境下的错误处理 May 04, 2024 pm 04:42 PM

C++中函数异常处理对于多线程环境尤为重要,以确保线程安全和数据完整性。通过try-catch语句,可以在出现异常时捕获和处理特定类型的异常,以防止程序崩溃或数据损坏。

PHP 多线程如何实现? PHP 多线程如何实现? May 06, 2024 pm 09:54 PM

PHP多线程是指在一个进程中同时运行多个任务,通过创建独立运行的线程实现。PHP中可以使用Pthreads扩展模拟多线程行为,安装后可使用Thread类创建和启动线程。例如,在处理大量数据时,可将数据分割为多个块,创建对应数量的线程同时处理,提高效率。

Java函数的并发和多线程如何提高性能? Java函数的并发和多线程如何提高性能? Apr 26, 2024 pm 04:15 PM

使用Java函数的并发和多线程技术可以提升应用程序性能,包括以下步骤:理解并发和多线程概念。利用Java的并发和多线程库,如ExecutorService和Callable。实践多线程矩阵乘法等案例,大大缩短执行时间。享受并发和多线程带来的应用程序响应速度提升和处理效率优化等优势。

PHP 函数在多线程环境中的行为如何? PHP 函数在多线程环境中的行为如何? Apr 16, 2024 am 10:48 AM

在多线程环境中,PHP函数的行为取决于其类型:普通函数:线程安全,可并发执行。修改全局变量的函数:不安全,需使用同步机制。文件操作函数:不安全,需使用同步机制协调访问。数据库操作函数:不安全,需使用数据库系统机制防止冲突。

JUnit单元测试框架在多线程环境中的用法 JUnit单元测试框架在多线程环境中的用法 Apr 18, 2024 pm 03:12 PM

在多线程环境中使用JUnit时,有两种常见方法:单线程测试和多线程测试。单线程测试在主线程上运行,避免并发问题,而多线程测试在工作线程上运行,需要同步测试方法来确保共享资源不受干扰。常见使用案例包括测试多线程安全方法,例如使用ConcurrentHashMap存储键值对,并发线程对键值对进行操作并验证其正确性,体现了多线程环境中JUnit的应用。

C++中如何处理多线程中的共享资源? C++中如何处理多线程中的共享资源? Jun 03, 2024 am 10:28 AM

C++中使用互斥量(mutex)处理多线程共享资源:通过std::mutex创建互斥量。使用mtx.lock()获取互斥量,对共享资源进行排他访问。使用mtx.unlock()释放互斥量。

C++ 内存管理在多线程环境中的挑战和应对措施? C++ 内存管理在多线程环境中的挑战和应对措施? Jun 05, 2024 pm 01:08 PM

在多线程环境中,C++内存管理面临以下挑战:数据竞争、死锁和内存泄漏。应对措施包括:1.使用同步机制,如互斥锁和原子变量;2.使用无锁数据结构;3.使用智能指针;4.(可选)实现垃圾回收。

C++ 多线程程序测试的挑战和策略 C++ 多线程程序测试的挑战和策略 May 31, 2024 pm 06:34 PM

多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞态检测:使用工具查找潜在的数据竞态,如valgrind。调试:使用调试器(如gdb)检查运行时程序状态,找到数据竞争根源。

See all articles