Not*_*ull 10 sql postgresql transactions commit
假设我有一个表,我想使用serial主键来请求客户端的更改.客户将询问"在密钥X后给我更改".不使用SERIALIZABLE隔离级别或锁定,这很容易出现竞争条件.
事务A可以先启动,然后执行写操作,然后花费很长时间来提交.同时事务B将在A提交之前启动并提交.来自B的写入将获得比来自A的写入更高的主键.如果客户端现在要求更改,则它将错过来自A的仍然未提交的写入,并记下最新的最高主键.因此,即使在A提交之后,客户端也永远不会看到该更改,因为它的密钥低于客户端已经获得的更改.
是否有可能serial在提交时以原子方式确定a (或来自计数器的类似值),以便保证在提交时它将高于所有其他值,并且低于在其之后提交的所有值?如果不是解决这个问题的最佳方法是什么?
Postgres 9.5引入了与此问题相关的新功能:提交时间戳.
你只需要激活track_commit_timestamp的postgresql.conf(并重新启动!)开始跟踪提交时间戳.然后你可以查询:
SELECT * FROM tbl
WHERE pg_xact_commit_timestamp(xmin) >= '2015-11-26 18:00:00+01';
Run Code Online (Sandbox Code Playgroud)
阅读Postgres Wiki中的"提交时间戳跟踪"一章.手册中的
相关实用程序功能.
函数波动只是VOLATILE因为事务ID(xid)可以根据定义进行包装.因此,您无法在其上创建功能索引.
您可以IMMUTABLE在有限的时间范围内为应用程序伪造函数包装器中的波动性,但您需要了解其含义.相关案例有更多解释:
对于许多只对提交顺序感兴趣的用例(而不是绝对时间),使用xmin强制转换为bigint"直接"(xmin::text::bigint)而不是提交时间戳可能更有效.(xid内部是无符号整数,上半部分不适合签名integer.)同样,请注意由于可能的xid环绕而产生的限制.
出于同样的原因,提交时间戳不会无限期保留.对于中小型数据库,xid几乎没有发生过环绕 - 但最终如果集群的存在时间足够长.有关详细信息,请阅读手册中的"防止事务ID包装失败"一章.
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |