mysql查看当前事务id

本文介绍如何在MySQL中查询当前会话的事务ID(TRX_ID),包括使用INFORMATION_SCHEMA.INNODB_TRX表结合CONNECTION_ID()函数的方法。



  

SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX

MySQL 如何获得当前会话的TRX_ID 事务ID

SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX  WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();

begin;
select * from hbec_wallet_cg_fund_profit;
SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX  WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID();
commit;

MySQL 中,要**查询当前正在运行的事务及其对应的进程 ID(即线程 ID)**,你可以通过查询 `information_schema.INNODB_TRX` 表来实现。这个表记录了当前 InnoDB 存储引擎中所有活跃的事务信息。 --- ### ✅ 方法:使用 `information_schema.INNODB_TRX` 查询事务和进程 ID ```sql SELECT trx_id, -- 事务ID trx_state, -- 事务状态(RUNNING, LOCK WAIT 等) trx_started, -- 事务开始时间 trx_mysql_thread_id, -- 对应的MySQL线程ID(即进程ID,可用于KILL) trx_query, -- 当前正在执行的SQL语句 trx_operation_state, -- 当前操作状态 trx_tables_in_use, -- 使用的表数量 trx_lock_structs -- 锁结构数量(反映锁争用情况) FROM information_schema.INNODB_TRX; ``` --- ### 🔍 输出示例说明: | 字段 | 含义 | |------|------| | `trx_id` | 内部事务标识符(InnoDB生成) | | `trx_state` | 如 `RUNNING`, `LOCK WAIT` | | `trx_started` | 事务启动时间,可用于判断是否为长事务 | | `trx_mysql_thread_id` | **关键字段!这就是可以被 `KILL` 的线程ID** | | `trx_query` | 正在执行的 SQL,帮助你定位问题 | > 💡 如果你想终止某个事务,使用: > > ```sql > KILL <trx_mysql_thread_id>; > ``` > > 例如: > > ```sql > KILL 456; > ``` --- ### 🛠️ 扩展:联合其他表查看更详细信息(推荐用于排查) #### 1. 查看谁在阻塞别人?——结合 `INNODB_LOCK_WAITS` ```sql SELECT r.trx_id AS waiting_trx_id, r.trx_mysql_thread_id AS waiting_thread, r.trx_query AS waiting_query, b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_thread, b.trx_query AS blocking_query FROM information_schema.innodb_lock_waits w JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id; ``` 📌 这个查询能告诉你: - 哪个事务在等待锁(waiting) - 哪个事务持有锁不放导致阻塞(blocking) 👉 可以优先 `KILL blocking_thread` 来解除死锁或长时间等待。 --- #### 2. 结合 `performance_schema.threads` 获取用户连接信息(可选) ```sql SELECT t.TRX_ID, t.TRX_MYSQL_THREAD_ID, p.PROCESSLIST_ID, p.PROCESSLIST_USER, p.PROCESSLIST_HOST, p.PROCESSLIST_DB, p.PROCESSLIST_COMMAND, p.PROCESSLIST_TIME FROM information_schema.INNODB_TRX t JOIN performance_schema.threads th ON t.trx_mysql_thread_id = th.PROCESSLIST_ID JOIN performance_schema.threads p ON th.THREAD_ID = p.THREAD_ID; ``` 这有助于识别是哪个客户端、哪个用户发起的事务。 --- ### ⚙️ 实用技巧:查找“长事务”(超过一定时间未提交) ```sql -- 查找运行超过 60 秒的事务 SELECT trx_id, trx_mysql_thread_id, trx_started, NOW() AS current_time, TIMESTAMPDIFF(SECOND, trx_started, NOW()) AS duration_sec, trx_query FROM information_schema.INNODB_TRX WHERE TIMESTAMPDIFF(SECOND, trx_started, NOW()) > 60; ``` 可用于监控告警系统。 --- ### ✅ 总结:如何查事务的“进程ID”? | 目标 | SQL | |------|-----| | ✅ 查看所有活跃事务及线程ID | `SELECT trx_mysql_thread_id FROM information_schema.INNODB_TRX;` | | ✅ 查看阻塞关系 | 使用 `INNODB_LOCK_WAITS` 联查 | | ✅ 终止某个事务 | `KILL <trx_mysql_thread_id>` | | ✅ 防止长期事务 | 设置 `innodb_lock_wait_timeout` + 应用层超时控制 | ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值