コードがtransaction.atomicブロック内で実行されているときに例外が発生すると、データベースハンドラはロールバックが必要とマークされます。 、まだそのtransaction.atomicブロック内で、後続のクエリが実行されている場合は、次のエラーが発生します。この時点でTransactionManagementErrorルート例外を覆い隠す
TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic'
を、実際のルート・エラーは、あなたがジャンプする必要が残して、アクセスに隠さとはかなり困難です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
どのようにあなたが本当にあなたがこのシナリオを打ったときに何が起こっているか仕事か、そしてどのようにあなたが定期的にこのシナリオを回避するのですか?
(以下自己の答え - しかし、相手の思考で純粋に興味を持って!)