在MySQL/InnoDB上使用了一个带有间隙锁的查询:
SELECT id, time, count
FROM table_a
WHERE time
BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR)
AND NOW()
FOR UPDATE
它锁定time
范围并返回最近的记录(如果存在的话)(在最后24小时内)。如果没有,会话在过去24小时内仍然拥有一个锁,以安全地插入一个新记录。
在PostgreSQL中是否有可能在整个24小时内(即使没有记录)设置相同的间隙锁?
发布于 2020-07-12 22:16:05
在PostgreSQL中这样做的方法是对所有事务使用SERIALIZABLE
隔离级别。
那么您根本不需要FOR UPDATE
。PostgreSQL不会阻止在gap中插入行,但是如果两个事务同时读取和写入相同间隙中的值,其中一个事务将得到序列化错误并不得不重新执行事务(在第二次尝试时,它将发现间隙不为空)。
这里所使用的概念是可序列化的:如果其他人没有读取就插入到间隙中(该事务在逻辑上是在使用您的SELECT
的事务之后),则是可以接受的。但是,如果两个事务都发现gap为空,然后插入一些内容,就会产生一个由SERIALIZABLE
阻止的异常。
https://stackoverflow.com/questions/62861964
复制