【发布时间】:2017-08-25 23:37:04
【问题描述】:
当代码在 transaction.atomic 块中执行并引发异常时,数据库处理程序被标记为需要回滚。如果仍在该 transaction.atomic 块中执行后续查询,则会引发以下错误:
TransactionManagementError:当前发生错误 交易。在“原子”结束之前,您无法执行查询
此时,实际的根错误已被掩盖且很难访问,因此您需要跳转到 Django 的事务代码中。
一个可能导致此错误的简单示例:
def someview(request):
with transaction.atomic():
// do some things
instance = SomeModel.objects.create(...)
// some other db queries
@receiver(post_save, sender=SomeModel)
def non_critical_side_effect(
sender, instance, created, raw, using, update_fields, **kwargs
):
try:
// some query that causes a database error
SomeModelLog.objects.create(some_non_none_field=None)
except IntegrityError:
//notify ourselves, go on
pass
当您遇到这种情况时,您如何弄清楚实际发生了什么,以及您通常如何避免这种情况?
(下面的自我回答 - 但真正对他人的想法感兴趣!)
【问题讨论】:
标签: django