是否可通过psql命令行工具接入正在运行的事务?
针对同一运行中事务使用psql查询的实现方法
方案1:事务快照共享(无侵入推荐方案)
这个方案不会影响原有测试事务的运行,也不需要修改业务代码,仅能做查询操作:
- 命中断点后,在调试器的当前数据库连接上下文执行SQL:
SELECT pg_export_snapshot();,记录返回的快照ID,格式类似00000004-0000002F-1 - 新开psql会话连接到同一个数据库,依次执行以下命令:
-- 开启可重复读隔离级别的事务 BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 导入刚才拿到的事务快照 SET TRANSACTION SNAPSHOT '你记录的快照ID';
- 此时在该psql会话中执行的所有查询,看到的数据和当前测试运行的未提交事务中的数据完全一致。
注意:原有测试事务提交/回滚后,导出的快照会立即失效,需要重新执行上述步骤才能获取新的事务数据。如果原有事务后续执行了新的写操作,需要重新导出快照并在psql中导入,才能看到最新的未提交修改。
方案2:直接在调试上下文执行SQL
如果不需要单独用psql,可以直接在调试器中调用当前数据库连接的执行方法,运行你需要的SQL语句直接获取结果,操作更简单不需要额外配置。
注意事项
- 事务快照功能是PostgreSQL 9.2及以上版本内置功能,不需要安装额外扩展
- 快照共享方式下的psql事务默认是只读的,不会修改原有事务的数据,也不会锁表影响原有测试流程
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

