在Postgres中锁定表以允许其他事务进行读取,但禁止写入。

5
我正在开发一个Django应用程序。其中有一项功能,我想通过读取、计算和插入多个表来改变数据库状态。这是一个原子过程,不能只是“单线程”,因为所得到的状态取决于执行此类过程的顺序。
为此,我使用了带有单个worker的Celery。我考虑使用Postgres中的SERIALIZED隔离级别,直到我读到:
可串行化事务保证产生与按某种顺序逐个运行它们相同的效果
但我不需要“某些”,我需要“确切”的顺序,这就是为什么我选择了消息队列。
在过程期间,我希望完全禁止对我操作的表进行写入,但仍允许读取。哪种最不严格的LOCK模式适合我的情况?
1个回答

7
如果我理解您的问题正确,您想要:
lock table_name in exclusive mode;
https://www.postgresql.org/docs/current/static/sql-lock.html https://www.postgresql.org/docs/current/static/explicit-locking.html

EXCLUSIVE

与 ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE 和 ACCESS EXCLUSIVE 锁模式冲突。这种模式只允许同时存在 ACCESS SHARE 锁,也就是说,只有在持有此锁模式的事务中进行的对表的读操作才能并行执行。

其他会话将以您启动事务并锁定表之前的状态读取表。试图写入表会将会话置于等待状态,直到您的事务完成。


1
谢谢。我已经阅读了那份文档,现在认为 SHARE 更不受限制。 - salairsky
如何限制甚至只读?有什么想法吗,伙计们? - Ashutosh Tiwari
我认为你要找的是 ACCESS EXCLUSIVE - Pirulax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接