【发布时间】:2016-02-29 20:06:20
【问题描述】:
假设我有一个表,我想使用serial 作为主键来请求客户端进行更改。客户会问“给我密钥 X 之后的更改”。如果不使用SERIALIZABLE 隔离级别或锁定,这很容易出现竞争条件。
事务 A 可以先启动,然后进行写入,然后需要很长时间才能提交。同时,事务 B 将在 A 提交之前启动并提交。来自 B 的写入将获得比来自 A 的写入更高的主键。如果客户端现在要求更改,它将错过来自 A 的仍未提交的写入,并记下最新的最高主键。因此,即使在 A 提交之后,客户端也永远不会看到该更改,因为它的密钥低于客户端已经获得的更改。
是否可以在提交时自动确定serial(或来自计数器的类似值)的值,以便我们保证在提交时它高于所有其他值,低于所有其他值之后会犯吗?如果不是,解决此问题的最佳方法是什么?
【问题讨论】:
-
如果没有提交时间戳来提供一致的全局排序,这实际上在并发插入的情况下很难做到。 PostgreSQL 通过跟踪最旧和最新的当前 xid 以及在其中提交的位图来在 xid 级别为快照执行此操作。不过,我认为您不能真正将其转化为序列的使用。
标签: sql postgresql transactions commit