【发布时间】:2017-08-13 09:35:00
【问题描述】:
我正在尝试通过使用 select_for_update 实用程序来利用 django 的行级锁定。根据文档,这只能在 transaction.atomic 块内使用。使用transaction.atomic 块的副作用是,如果我的代码抛出异常,所有数据库更改都会回滚。我的用例是这样的,我实际上希望保留数据库更改,并允许传播异常。这让我的代码看起来像这样:
with transaction.atomic():
user = User.objects.select_for_update.get(id=1234)
try:
user.do_something()
except Exception as e:
exception = e
else:
exception = None
if exception is not None:
raise exception
这感觉完全是反模式,我敢肯定我一定遗漏了一些东西。我知道我可能会通过手动使用transaction.set_autocommit 来管理事务来推出我自己的解决方案,但我认为会有一种更简单的方法来获得此功能。有没有一种内置的方式来实现我想要的?
【问题讨论】:
标签: django transactions database-locking