小编Jul*_*ier的帖子

如何使用PostgreSQL保持每行唯一的计数器?

我需要在 document_revisions 表中保留一个唯一的(每行)修订号,其中修订号的范围仅限于文档,因此它不是整个表唯一的,仅适用于相关文档。

我最初想出了类似的东西:

current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123;
INSERT INTO document_revisions(rev) VALUES(current_rev + 1);
Run Code Online (Sandbox Code Playgroud)

但是有一个竞争条件!

我试图用 解决它pg_advisory_lock,但文档有点稀缺,我不完全理解它,我不想错误地锁定某些东西。

以下是可以接受的,还是我做错了,或者有更好的解决方案?

SELECT pg_advisory_lock(123);
current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123;
INSERT INTO document_revisions(rev) VALUES(current_rev + 1);
SELECT pg_advisory_unlock(123);
Run Code Online (Sandbox Code Playgroud)

我不应该为给定的操作 (key2) 锁定文档行 (key1) 吗?所以这将是正确的解决方案:

SELECT pg_advisory_lock(id, 1) FROM documents WHERE id = 123;
current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123;
INSERT INTO document_revisions(rev) VALUES(current_rev + 1);
SELECT pg_advisory_unlock(id, 1) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql locking

11
推荐指数
2
解决办法
2万
查看次数

标签 统计

locking ×1

postgresql ×1