【发布时间】:2017-07-04 09:38:00
【问题描述】:
在 Postgresql 中,如果事务 id 是“123456”,表名是“table1”,那么我可以执行以下查询吗? :
Select count (*) from table1 where xmin=123456 OR xmax=123456
如果 count 返回值 > 1,那么我可以假设事务 id 已提交吗?
_
注意:
- 事务 id 从不同的 java 程序发送到另一个 java 通过 RMI (OR) TCP Sockets (OR) File (OR) 其他机制进行编程
- 事务 ID 从更新、插入、删除后收集 触发
- 在这些操作期间不执行真空或任何其他维护程序
- 也不用担心 txid 环绕问题
在使用 oracle 时,v$transaction 来拯救...但在 Postgres 中,我找不到类似的东西... 虽然一些谷歌搜索让我相信有办法使用 "pg_log" 文件或 "pg_locks" 视图找到它,但我不知道如何
我能想到的唯一脏方法是 xmin 和 xmax...我什至无法判断这是否是一个脏方法
是否有任何 Postgresql 老师可以引导我走向正确的方向?
更新:
对于 postgresql 9.5 及更高版本,“laurenz albe”的答案是完美的... 对于那些使用 Postgresql 9.0 到 9.3 的人,你应该使用,
SELECT count(xmin) as SIZE FROM table1 WHERE xmin = 123456 AND xmax = 0
此外,当发生删除操作并且您获得事务 id 时,我们需要以不同的方式检查它...
SELECT count(xmin) as SIZE FROM table1 WHERE xmin = 123456 OR xmax = 123456
然后检查结果。如果返回零,则提交删除操作...如果结果为非零,则事务回滚,您不必担心未提交的事务
注意: 这是为了检查从触发器接收并发送到另一个外部程序(java)的事务 id 是否已提交且未回滚,并且数据库会话是否不同...
【问题讨论】:
-
所以您只想知道 table1 中是否存在 transactionId 为 123456 的行?为什么不
select count(*) from table1 where transactionId='123456'? -
@DaveH 我不知道有一个名为
transactionId的系统列它会在 postgres 9.0 和 9.3 中工作吗? -
请不要为问题添加可能的解决方案。问题应仅包含问题本身的一部分信息。
-
@RealSkeptic,哎呀对不起...删除它...
-
@DaveH,您确定有一个名为
transactionId的系统列吗?因为当我在postgresql docs 中查看时,我找不到它...
标签: java database postgresql transactions ipc