ATOMIC_REQUESTS
HTTP リクエストにトランザクションを結びつける¶
ウェブ上でトランザクションを扱う一般的な方法は、各リクエストをトランザクションでラップすることです。この動作を有効化したい各データベースの設定で、ATOMIC_REQUESTS を True にセットしてください。
ATOMIC_REQUESTS=True としている場合のview関数内(または、 with transaction.atomic() のwithブロック中)に例外が発生すると、その時点でsave済みのモデルも破棄(rollback)されます
code:python
def view(request):
m = SomeModel.objects.create() # ここで保存される
do_some_process() # raise some exception!
return render(...)
このコードの場合、 ATOMIC_REQUESTS=True を 設定していない 場合は、do_some_process()が例外を発生させたとしても「ここで保存される」で本当にDBに保存されているので、DBは更新されます。
これに対して ATOMIC_REQUESTS=True と 設定している 場合は、「ここで保存される」のはトランザクション上の話になるので、do_some_process()で例外が起きれば、rollbackされ、DBは更新されません。
もしtry/exceptで例外をview関数の外にもれないようにすれば、 ATOMIC_REQUESTS=True であってもDBは更新されます。
code:python
# ATOMIC_REQUESTS=True
def view(request):
m = SomeModel.objects.create() # ここで保存される
try:
do_some_process() # raise some exception!
except:
pass # 例外にぎりつぶし
return render(...)
# viewk関数は正常に完了し、「ここで保存される」のデータはview関数を出たところでcommitされる
view関数を成功するまでリトライし続ける実装は、同一トランザクション中だと(DBのISOLATION LEVELにもよるかもしれませんが)できないかもしれません(未確認です)。