提交后保持对数据库对象的锁定

时间:2015-08-25 12:13:35

标签: python django postgresql postgresql-9.3

我正在选择一些对象进行更新,然后对其进行操作

obj = Model.objects.select_for_update().get(id=someID)
obj.somefield = 1
obj.save()

我还需要保持 FOR UPDATE锁定此对象。 PostgreSQL文档说,FOR UPDATE锁将一直存在,直到事务结束,这将结束,因为save将触发提交。 即使我手动管理提交,我也需要将一些信息保存到数据库中(为此我需要提交)。

那么,在这种情况下我能做些什么呢? 如果我将再次选择对象,则在设置新锁之前,其他一些进程可能会对此对象执行更改。

(我正在使用django 1.7和postgresql 9.3)

1 个答案:

答案 0 :(得分:2)

在事务提交或回滚后,您无法保持行锁定。

advisory locks这可能是一个合理的用例,但很难说提供的细节有限。咨询锁可以在会话级别运行,跨越事务边界。

你不能(ab)使用int numberOutput=1; for (int i =0;i<lines;i++){ for (int j = 0;j<i+1;j++){ System.out.print(numberOutput); numberOutput++; } System.our.print("\n"); } 光标:

WITH HOLD

所以我认为咨询锁是你唯一的选择。

顺便说一下,处理此问题的通常方法是其他任务之间进行更改。确保每个事务使对象处于合理的合理状态。如果其他人在您的两个更改之间进行了更改,那么设计一下就可以了。

为避免覆盖之间所做的更改,您可以使用行版本列使用optimistic concurrency control,也称为乐观锁定。如果您看到有人偷偷摸摸并进行了更改,您需要重新加载对象以获取新版本,重复更改,然后再尝试保存。不幸的是,与像Hibernate这样的更复杂的ORM不同,它看起来并不像Django内置支持乐观并发控制,但似乎有扩展添加它。