PostgreSQL如何查看所有未提交的事务列表?
查看未提交事务的方法
不同数据库查看未提交事务的方式略有不同,以下是主流数据库的实现方案:
PostgreSQL
通过pg_stat_activity系统视图可以查询所有未提交的事务:
SELECT pid, datname, usename, query, state, xact_start FROM pg_stat_activity WHERE state IN ('idle in transaction', 'active') AND xact_start IS NOT NULL;
idle in transaction:事务已开启但当前无执行语句的状态active:事务内正在执行语句的状态xact_start:事务的启动时间,可用于定位长时间未提交的事务
如果只想查看当前会话的未提交事务,先获取当前会话ID:
SELECT pg_backend_pid();
再代入上面的查询过滤pid即可。
MySQL
针对InnoDB引擎的事务,可查询INFORMATION_SCHEMA.INNODB_TRX系统表:
SELECT trx_id, trx_started, trx_mysql_thread_id, trx_query FROM INFORMATION_SCHEMA.INNODB_TRX;
trx_query:事务内最后执行的SQL语句trx_mysql_thread_id:对应会话的连接ID,可结合SHOW PROCESSLIST查看更多会话细节
查看当前会话的未提交事务,先获取当前连接ID:
SELECT CONNECTION_ID();
再过滤trx_mysql_thread_id即可。
SQL Server
通过sys.dm_tran_active_transactions动态管理视图查询活跃事务,可关联其他视图获取更多上下文信息:
SELECT tat.transaction_id, tat.transaction_begin_time, des.login_name, dest.text AS last_executed_query FROM sys.dm_tran_active_transactions tat JOIN sys.dm_exec_sessions des ON tat.session_id = des.session_id LEFT JOIN sys.dm_exec_requests der ON tat.session_id = der.session_id CROSS APPLY sys.dm_exec_sql_text(der.sql_handle) dest WHERE tat.transaction_type != 2; -- 排除系统级事务
transaction_begin_time:事务启动时间last_executed_query:事务内最后执行的SQL语句
内容的提问来源于stack exchange,提问作者Chicken Sandwich No Pickles
相关产品推荐
相关产品推荐

