4
如何使用PostgreSQL在每一行上保持唯一的计数器?
我需要在document_revisions表中保留一个唯一的(每行)修订号,该修订号的作用域是一个文档,因此它不是整个表唯一的,而仅是相关文档的唯一。 我最初想到的是: current_rev = SELECT MAX(rev) FROM document_revisions WHERE document_id = 123; INSERT INTO document_revisions(rev) VALUES(current_rev + 1); 但是有比赛条件! 我正在尝试使用来解决它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); 我是否应该为给定操作(key2)锁定文档行(key1)?因此,这将是正确的解决方案: SELECT pg_advisory_lock(id, 1) FROM documents WHERE id = …