如何在PostgreSQL中查看当前未提交事务对表的修改行
如何在PostgreSQL中查看当前未提交事务对表的修改行
当然有办法啦!在PostgreSQL里,你完全可以不用提前知道主键或具体字段值,就能查看当前未提交事务对表做的所有修改——刚好对应你说的“提交前检查变更”的需求。下面给你分享几个实用的方法:
方法一:利用内置系统列查询(无需额外扩展)
PostgreSQL的每张表都自带几个隐藏的系统列,我们可以借助它们精准定位当前事务的修改:
- 查看当前事务插入的新行
插入的行的xmin(插入/更新该行的事务ID)会等于当前事务ID,且xmax(删除/更新该行的事务ID)为0(还没被修改)。执行以下SQL:SELECT * FROM your_table_name WHERE xmin = txid_current(); - 查看当前事务更新过的行
PostgreSQL的更新操作本质是“标记旧行为删除+插入新行”,所以要查更新的内容可以分两步:- 被标记为删除的旧行:
SELECT * FROM your_table_name WHERE xmax = txid_current(); - 更新后的新行:直接用上面插入行的查询语句即可,新行的
xmin同样等于当前事务ID。
- 被标记为删除的旧行:
- 查看当前事务删除的行
在当前未提交的事务中,被删除的行还没被物理清理,只是被标记了删除标记(xmax等于当前事务ID),可以用下面的SQL查看:
注意:一旦事务提交,这些标记的行会在后续VACUUM操作中被物理删除,那时就查不到了。SELECT * FROM your_table_name WHERE xmax = txid_current();
方法二:使用pgrowlocks扩展获取更详细信息
如果你需要更全面的行级锁和修改细节,可以安装pgrowlocks扩展:
- 先创建扩展(只需执行一次):
CREATE EXTENSION IF NOT EXISTS pgrowlocks; - 查询当前事务修改的行:
这个查询会返回被当前事务锁定/修改的行的详细信息,包括事务ID、行物理位置、锁类型等,适合排查复杂的事务修改场景。SELECT * FROM pgrowlocks('your_table_name') WHERE locked_by = txid_current();
一些注意事项
- 这些查询必须在当前事务所在的会话中执行,每个会话的事务ID是独立的,换个会话查不到当前事务的修改。
- 如果是在只读事务中执行,这些查询不会返回任何结果,因为只读事务不允许修改数据。
- 对于分区表,直接执行上述SQL即可,PostgreSQL会自动扫描所有子分区。
另外,如果你用的是pgAdmin这类可视化客户端,它们通常会在事务未提交时,直接在界面上标记出被修改的行,不过上面的SQL方法是最通用的,不管用什么客户端都能生效。
内容来源于stack exchange
相关产品推荐
相关产品推荐

