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.
 
 
 

143 lines
3.5 KiB

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