gpt4 book ai didi

java - 这是检查 Postgres 是否提交事务 ID 的正确方法吗

转载 作者:搜寻专家 更新时间:2023-10-30 22:07:40 24 4
gpt4 key购买 nike

在Postgresql中,如果事务id是“123456”,表名是“table1”,那么我是否可以执行下面的查询? :

Select count (*) from table1 where xmin=123456 OR xmax=123456

如果计数返回值 > 1,那么我可以假设事务 ID 已提交吗?

_

注意:

  1. 事务 id 从不同的 java 程序发送到另一个 java通过 RMI (OR) TCP Sockets (OR) File (OR) 一些其他机制编程
  2. 事务 ID 是从更新、插入、删除之后收集的触发器
  3. 在这些操作期间不执行真空或任何其他维护程序
  4. 也不要担心 txid 环绕问题

当使用 oracle 时,v$transaction 来拯救... 但在 Postgres 中,我找不到类似的东西...虽然一些谷歌搜索让我相信有办法使用“pg_log”文件或“pg_locks” View 找到它,但我不知道如何

我唯一能想到的肮脏方法是 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 是否已提交且未回滚并且数据库 session 不同...

最佳答案

xmax 的测试是错误的。

xmax 在行版本(PostgreSQL 中的 tuple)被 UPDATEDELETE< 标记为无效时设置。这意味着具有较晚事务 ID 的任何事务都不能看到此元组,并且一旦没有人再看到它就可以将其回收。

如果事务被回滚,xmax 的值不会被重置——事务状态存储在提交日志中,并且元组对其他人仍然可见。

但是xmax也是用来存储行锁的。

因此,如果您可以看到 xmax = '123456' 的元组,则表示以下之一:

  • 元组已删除或更新,事务已提交,但您的事务快照较旧,因此您仍然看到旧元组。

  • 元组被删除或更新,事务被回滚。

  • 元组被事务 123456 锁定,例如使用 SELECT ... FOR UPDATE

另一方面,如果您看到一个包含 xmin = '123456' 的元组并且这不是您当前的事务,您可以确定该事务已提交。

所以你的测试应该是

SELECT count(*) FROM table1 WHERE xmin='123456';

但这是一个糟糕的查询。它强制对整个表进行顺序扫描,并且不允许在系统列上建立索引。

如果您使用的是 PostgreSQL 9.5 或更新版本,请考虑激活 track_commit_timestamp 并使用函数 pg_xact_commit_timestamp(xid) 。对于未提交的事务,它将返回 NULL。

关于java - 这是检查 Postgres 是否提交事务 ID 的正确方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44902321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com