在Postgres中锁定表以允许其他交易阅读,但不允许写

时间:2017-05-29 11:07:48

标签: django postgresql locking

我正在开发一个Django应用程序。有一个功能,我想通过读取,进行计算和插入许多表来更改数据库状态。这是一个原子过程,它不能只是“单线程”,因为结果状态取决于执行这些过程的顺序。

为此,我使用Celery和一名工人。我想到了Postgres中的SERIALIZED隔离级别,直到我读过:

  

可保证可序列化交易产生的效果与在某些订单中一次运行一个相同的效果

但是我不需要一些,我需要完全顺序,这就是我选择消息队列的原因。

在程序中,我想禁止写入我完全操作的表格,但仍然允许阅读。什么限制最少的LOCK模式适合我的情况?

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你想:

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冲突,   分享,分享行独家,独家和访问独家锁定   模式。此模式仅允许并发ACCESS SHARE锁,即仅允许   从表中读取可以与事务并行进行   持有这种锁定模式。

其他会话将在您启动事务并锁定表之前的状态读取表。尝试写入表将使会话等待您的事务完成