小编luk*_*arm的帖子

TransactionManagementError 隐藏根异常

当代码在 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
Run Code Online (Sandbox Code Playgroud)

当您遇到这种情况时,您如何弄清楚真正发生了什么,以及您如何定期避免这种情况?

(下面的自我回答 - 但真正对别人的想法感兴趣!)

django

6
推荐指数
1
解决办法
240
查看次数

标签 统计

django ×1