Lib*_*aul 5 postgresql locking
MySQL/InnoDB 中使用了一个带间隙锁的查询:
SELECT id, time, count
FROM table_a
WHERE time
BETWEEN DATE_SUB(NOW(), INTERVAL 24 HOUR)
AND NOW()
FOR UPDATE
Run Code Online (Sandbox Code Playgroud)
它锁定time范围并返回最近的记录(如果存在)(过去 24 小时内)。如果不是 - 会话在过去 24 小时内仍然拥有锁,以安全地插入新记录。
是否可以在 PostgreSQL 中在整个 24 小时持续时间内(即使没有记录)进行相同的间隙锁定?
在 PostgreSQL 中执行此操作的方法是SERIALIZABLE对所有事务使用隔离级别。
FOR UPDATE那你就根本不需要了。PostgreSQL 不会阻止在间隙中插入行,但如果两个事务同时在同一间隙中读取和写入值,其中一个将出现序列化错误并且必须重做事务(在第二次尝试时,它将发现间隙不为空)。
这里起作用的概念是可序列化:如果其他人在不读取的情况下插入间隙是可以接受的(逻辑上该事务位于您的事务之后SELECT)。但是,如果两个事务都发现间隙是空的,然后插入一些东西,那么就会产生一个可以被 阻止的异常SERIALIZABLE。