4

post_save作成または更新されたばかりのインスタンスを参照して、追加のレコードをデータベースに挿入するハンドラーがあります。ただし、追加のレコードを挿入するときにエラー (おそらく制約違反) が発生する場合があります。

ハンドラーで例外が発生した場合post_save、初期インスタンスがコミットされる可能性はありますか?

答えは、次のサブ質問に依存する場合があります。

  • Django の自動コミット モードはpost_saveシグナルの前または後にコミットしますか?
  • でエラーが発生した場合、Django はネストされたトランザクションを使用して保存中のインスタンスをロールバックしようとしますpost_saveか?
4

1 に答える 1

5

ドキュメントによるとautocommit、初期インスタンスへの変更を使用している場合は、シグナルハンドラーの.save()前にコミットされます。post_saveの例外はpost_save、変更を初期インスタンスにロールバックしません。

のソースを見ると、これを確認できsave_baseますdjango/db/models/base.py。自動コミットは555行目(1.4.2)で発生しますが、post_save信号は564行目まで送信されません。また、Djangoがでネストされたトランザクションを使用しようとしないこともわかります.save()

デコレータを使用django.middleware.transaction.TransactionMiddlewareしてその動作をオーバーライドしていない場合、例外が発生すると、初期インスタンスへの変更を含むトランザクション全体がロールバックされます。autocommitpost_save

于 2012-11-22T17:12:44.367 に答える