You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.5 KiB

  1. -- MySQL 数据库事务状态检查和处理 SQL 语句
  2. -- 1. 查看当前所有连接和进程
  3. SHOW PROCESSLIST;
  4. -- 2. 查看当前正在运行的事务
  5. SELECT
  6. trx_id,
  7. trx_state,
  8. trx_started,
  9. trx_requested_lock_id,
  10. trx_wait_started,
  11. trx_weight,
  12. trx_mysql_thread_id,
  13. trx_query
  14. FROM INFORMATION_SCHEMA.INNODB_TRX;
  15. -- 3. 查看锁等待情况
  16. SELECT
  17. waiting_trx_id,
  18. waiting_thread,
  19. waiting_query,
  20. blocking_trx_id,
  21. blocking_thread,
  22. blocking_query
  23. FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
  24. -- 4. 查看当前锁定状态
  25. SELECT
  26. lock_id,
  27. lock_trx_id,
  28. lock_mode,
  29. lock_type,
  30. lock_table,
  31. lock_index,
  32. lock_space,
  33. lock_page,
  34. lock_rec,
  35. lock_data
  36. FROM INFORMATION_SCHEMA.INNODB_LOCKS;
  37. -- 5. 查看详细的锁等待信息(MySQL 8.0+)
  38. SELECT
  39. OBJECT_SCHEMA,
  40. OBJECT_NAME,
  41. LOCK_TYPE,
  42. LOCK_MODE,
  43. LOCK_STATUS,
  44. LOCK_DATA,
  45. ENGINE_TRANSACTION_ID,
  46. THREAD_ID,
  47. EVENT_ID
  48. FROM performance_schema.data_locks;
  49. -- 6. 查看锁等待关系(MySQL 8.0+)
  50. SELECT
  51. requesting_engine_transaction_id,
  52. requesting_thread_id,
  53. requesting_event_id,
  54. blocking_engine_transaction_id,
  55. blocking_thread_id,
  56. blocking_event_id
  57. FROM performance_schema.data_lock_waits;
  58. -- 7. 查看长时间运行的事务(超过30秒)
  59. SELECT
  60. trx_id,
  61. trx_state,
  62. trx_started,
  63. TIMESTAMPDIFF(SECOND, trx_started, NOW()) as duration_seconds,
  64. trx_mysql_thread_id,
  65. trx_query
  66. FROM INFORMATION_SCHEMA.INNODB_TRX
  67. WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 30;
  68. -- 8. 查看阻塞其他事务的连接
  69. SELECT
  70. p1.ID as blocking_thread_id,
  71. p1.USER as blocking_user,
  72. p1.HOST as blocking_host,
  73. p1.DB as blocking_db,
  74. p1.COMMAND as blocking_command,
  75. p1.TIME as blocking_time,
  76. p1.STATE as blocking_state,
  77. p1.INFO as blocking_query,
  78. p2.ID as blocked_thread_id,
  79. p2.USER as blocked_user,
  80. p2.HOST as blocked_host,
  81. p2.DB as blocked_db,
  82. p2.COMMAND as blocked_command,
  83. p2.TIME as blocked_time,
  84. p2.STATE as blocked_state,
  85. p2.INFO as blocked_query
  86. FROM INFORMATION_SCHEMA.PROCESSLIST p1
  87. JOIN INFORMATION_SCHEMA.INNODB_LOCK_WAITS w ON p1.ID = w.blocking_thread
  88. JOIN INFORMATION_SCHEMA.PROCESSLIST p2 ON p2.ID = w.waiting_thread;
  89. -- ===== 处理锁定事务的操作 =====
  90. -- 9. 杀死指定的连接(替换 CONNECTION_ID 为实际的连接ID)
  91. -- KILL CONNECTION_ID;
  92. -- 示例:杀死连接ID为123的连接
  93. -- KILL 123;
  94. -- 10. 强制杀死指定连接(即使在事务中)
  95. -- KILL CONNECTION CONNECTION_ID;
  96. -- 11. 回滚指定事务(需要在对应连接中执行)
  97. -- ROLLBACK;
  98. -- 12. 设置锁等待超时(秒)
  99. SET innodb_lock_wait_timeout = 50;
  100. -- 13. 查看当前锁等待超时设置
  101. SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
  102. -- ===== 预防措施 =====
  103. -- 14. 查看死锁信息
  104. SHOW ENGINE INNODB STATUS;
  105. -- 15. 开启死锁检测
  106. SET GLOBAL innodb_deadlock_detect = ON;
  107. -- 16. 查看事务隔离级别
  108. SELECT @@tx_isolation;
  109. -- 17. 设置事务隔离级别(如果需要)
  110. -- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
  111. -- ===== 使用步骤说明 =====
  112. /*
  113. 1. 1-4
  114. 2. ID和连接ID
  115. 3. 使KILL命令终止问题连接
  116. 4.
  117. - 使KILL命令
  118. -
  119. -
  120. */