-- 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命令
|
|
- 优先尝试让应用程序正常提交或回滚事务
|
|
- 如果必须强制终止,确保了解可能的数据影响
|
|
*/
|