【发布时间】:2017-04-07 13:37:37
【问题描述】:
我们正在尝试从 commit_manually 迁移到 atomic,以便我们可以在旧项目中将 Django 升级到至少 1.8。在大多数情况下,我们需要这样做:
with transaction.atomic():
obj = Entity.objects.select_for_update().get(pk=pk)
try:
obj.do_something()
obj.set_some_status()
obj.save()
except SomeException:
obj.set_failed_flag()
obj.save()
raise
因为被调用者需要这个异常信息来继续特定的流程。但在这种情况下,事务/保存点将被回滚,这不是我们想要的,因为我们希望提交 obj.set_failed_flag()。此外,将它设置在同一个原子块内似乎是合乎逻辑的,因为我们已经为这个对象锁定了一行。
有什么想法/模式吗?提前致谢!
附:使用旧的手动事务管理非常简单!
附言我们也为“提前退出”使用异常,并且移动到一些标志等会带来混乱的日志,我个人很想避免它。
【问题讨论】:
标签: python django transactions django-orm