gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:28:24 24 4
gpt4 key购买 nike

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

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

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

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

(我使用的是 django 1.7 和 postgresql 9.3)

最佳答案

在事务提交或回滚后,您不能持有行锁。

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

你不能(ab)使用WITH HOLD光标:

test=> DECLARE test_curs CURSOR WITH HOLD FOR SELECT * FROM dummy FOR UPDATE;
ERROR: DECLARE CURSOR WITH HOLD ... FOR UPDATE is not supported
DETAIL: Holdable cursors must be READ ONLY.

所以我认为咨询锁几乎是您唯一的选择。


顺便说一下,通常的处理方式是其他任务在两者之间进行更改。确保每个事务都使对象处于有意义的合理状态。如果其他人在您的两个更改之间进行了更改,请设计一些东西,这样就可以了。

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

关于python - 提交后保持对数据库对象的锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32203738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com