我正在选择一些对象进行更新,然后对其进行操作
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)
答案 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内置支持乐观并发控制,但似乎有扩展添加它。