3

トランザクション管理に関する Django ドキュメントの章を読みました。私が理解していることから、トランザクションTransactionMiddlewareは呼び出されるとすぐに開始されます。次に、 を使用して@commit_on_success@commit_manuallyトランザクションの終了を制御する可能性があります。

私の質問: TransactionMiddleware を完全に取り除くことなく、トランザクションの開始を制御する可能性はありますか? 私の懸念は、Django フレームワークの多くの部分が実際には TransactionMiddleware の存在に依存していることです。明示的に指定したアプリケーションに属するビューを除いて、すべてのビューに使用したいと思います。何よりも、特定のグループのビューのトランザクション動作を最初から最後まで完全に制御できるようにしたいと考えています。どのようなアプローチを取るべきですか? 私を助けるための外部アプリ、ライブラリはありますか? 最初のデータベース ヒットが発生するとすぐに、トランザクションは積極的に作成されますか、それとも遅延して作成されますか?

4

1 に答える 1

4
  1. トランザクションは最初の DB クエリで作成されます。

  2. TransactionMiddlewareすべてのビューに同様のものを適用しcommit_on_successます。これを明示的に追加する必要はありません。 commit_on_successビュー内から呼び出す特定の関数にこの動作を与えるのに役立ちます。

  3. ネストされたトランザクションがサポートされています。

では、なぜトランザクションの開始を制御する必要があるのでしょうか? 変更の一部だけをロールバックする場合は、ネストされたトランザクションを使用して行う必要があります。

私のコードからの一般的な使用例は次のとおりです。

@transaction.commit_manually
def purchase(request, ...):
    try:
      ... # change some data
      _purchase(request, *args, **kwargs) # process purchase optimistically
    except PurchaseError, ex: # My own exception class for errors we know about
      _log_purchase(request, ex) # Save error in DB
      messages.error(ex.human_message())
      transaction.commit() # Save log entries
    except:
      transaction.rollback()
      raise
    else:
      transaction.commit()

@transaction.commit_on_success
def _purchase(request, ...):
    ...  
于 2011-04-16T13:34:37.273 に答える