当代码在 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 ×1