提交后保持对数据库对象的锁定
Keep lock on database object after commit
我正在select更新一些对象,然后对其执行操作
obj = Model.objects.select_for_update().get(id=someID)
obj.somefield = 1
obj.save()
但是我仍然需要保持FOR UPDATE
锁定这个对象。
PostgreSQL 文档说 FOR UPDATE
锁将一直存在到事务结束,事务结束,因为保存将触发提交。
即使我将手动管理提交,我也需要将一些信息保存到数据库中(为此我需要提交)。
那么,在这种情况下我能做什么?
如果我将再次 select 对象,一些其他进程可能会在我设置新锁之前对此对象执行更改。
(我使用的是 django 1.7 和 postgresql 9.3)
事务提交或回滚后不能持有行锁。
这可能是 advisory locks 的合理用例,但由于所提供的详细信息有限,很难说清。咨询锁可以在会话级别运行,跨越事务边界。
您不能 (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 内置了对乐观并发控制的支持,但似乎有添加它的扩展。
我正在select更新一些对象,然后对其执行操作
obj = Model.objects.select_for_update().get(id=someID)
obj.somefield = 1
obj.save()
但是我仍然需要保持FOR UPDATE
锁定这个对象。
PostgreSQL 文档说 FOR UPDATE
锁将一直存在到事务结束,事务结束,因为保存将触发提交。
即使我将手动管理提交,我也需要将一些信息保存到数据库中(为此我需要提交)。
那么,在这种情况下我能做什么? 如果我将再次 select 对象,一些其他进程可能会在我设置新锁之前对此对象执行更改。
(我使用的是 django 1.7 和 postgresql 9.3)
事务提交或回滚后不能持有行锁。
这可能是 advisory locks 的合理用例,但由于所提供的详细信息有限,很难说清。咨询锁可以在会话级别运行,跨越事务边界。
您不能 (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 内置了对乐观并发控制的支持,但似乎有添加它的扩展。