|
|
- -- MySQL 数据库事务状态检查和处理 SQL 语句
-
- -- 1. 查看当前所有连接和进程
- SHOW PROCESSLIST;
-
- -- 2. 查看当前正在运行的事务
- SELECT
- trx_id,
- trx_state,
- trx_started,
- trx_requested_lock_id,
- trx_wait_started,
- trx_weight,
- trx_mysql_thread_id,
- trx_query
- FROM INFORMATION_SCHEMA.INNODB_TRX;
-
- -- 3. 查看锁等待情况
- SELECT
- waiting_trx_id,
- waiting_thread,
- waiting_query,
- blocking_trx_id,
- blocking_thread,
- blocking_query
- FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
-
- -- 4. 查看当前锁定状态
- SELECT
- lock_id,
- lock_trx_id,
- lock_mode,
- lock_type,
- lock_table,
- lock_index,
- lock_space,
- lock_page,
- lock_rec,
- lock_data
- FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-
- -- 5. 查看详细的锁等待信息(MySQL 8.0+)
- SELECT
- OBJECT_SCHEMA,
- OBJECT_NAME,
- LOCK_TYPE,
- LOCK_MODE,
- LOCK_STATUS,
- LOCK_DATA,
- ENGINE_TRANSACTION_ID,
- THREAD_ID,
- EVENT_ID
- FROM performance_schema.data_locks;
-
- -- 6. 查看锁等待关系(MySQL 8.0+)
- SELECT
- requesting_engine_transaction_id,
- requesting_thread_id,
- requesting_event_id,
- blocking_engine_transaction_id,
- blocking_thread_id,
- blocking_event_id
- FROM performance_schema.data_lock_waits;
-
- -- 7. 查看长时间运行的事务(超过30秒)
- SELECT
- trx_id,
- trx_state,
- trx_started,
- TIMESTAMPDIFF(SECOND, trx_started, NOW()) as duration_seconds,
- trx_mysql_thread_id,
- trx_query
- FROM INFORMATION_SCHEMA.INNODB_TRX
- WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 30;
-
- -- 8. 查看阻塞其他事务的连接
- SELECT
- p1.ID as blocking_thread_id,
- p1.USER as blocking_user,
- p1.HOST as blocking_host,
- p1.DB as blocking_db,
- p1.COMMAND as blocking_command,
- p1.TIME as blocking_time,
- p1.STATE as blocking_state,
- p1.INFO as blocking_query,
- p2.ID as blocked_thread_id,
- p2.USER as blocked_user,
- p2.HOST as blocked_host,
- p2.DB as blocked_db,
- p2.COMMAND as blocked_command,
- p2.TIME as blocked_time,
- p2.STATE as blocked_state,
- p2.INFO as blocked_query
- FROM INFORMATION_SCHEMA.PROCESSLIST p1
- JOIN INFORMATION_SCHEMA.INNODB_LOCK_WAITS w ON p1.ID = w.blocking_thread
- JOIN INFORMATION_SCHEMA.PROCESSLIST p2 ON p2.ID = w.waiting_thread;
-
- -- ===== 处理锁定事务的操作 =====
-
- -- 9. 杀死指定的连接(替换 CONNECTION_ID 为实际的连接ID)
- -- KILL CONNECTION_ID;
-
- -- 示例:杀死连接ID为123的连接
- -- KILL 123;
-
- -- 10. 强制杀死指定连接(即使在事务中)
- -- KILL CONNECTION CONNECTION_ID;
-
- -- 11. 回滚指定事务(需要在对应连接中执行)
- -- ROLLBACK;
-
- -- 12. 设置锁等待超时(秒)
- SET innodb_lock_wait_timeout = 50;
-
- -- 13. 查看当前锁等待超时设置
- SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
-
- -- ===== 预防措施 =====
-
- -- 14. 查看死锁信息
- SHOW ENGINE INNODB STATUS;
-
- -- 15. 开启死锁检测
- SET GLOBAL innodb_deadlock_detect = ON;
-
- -- 16. 查看事务隔离级别
- SELECT @@tx_isolation;
-
- -- 17. 设置事务隔离级别(如果需要)
- -- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-
- -- ===== 使用步骤说明 =====
- /*
- 1. 首先运行查询1-4来了解当前事务状态
- 2. 找出长时间运行或阻塞的事务ID和连接ID
- 3. 使用KILL命令终止问题连接
- 4. 确认锁定已解除
-
- 注意:
- - 在生产环境中谨慎使用KILL命令
- - 优先尝试让应用程序正常提交或回滚事务
- - 如果必须强制终止,确保了解可能的数据影响
- */
|