概要
Djangoでは、デフォルトではトランザクションは利用されません(オートコミットモード)。
そこで、Django ORMが提供しているデータベーストランザクションを使いましたので紹介します。
with transaction.atomic():
とは
transaction.atomic()
ブロック内のコードは、トランザクション内で実行されます。つまり、一連のデータベース操作がすべて成功した場合にのみコミットされ、途中でエラーが発生した場合にはロールバックされる、と言うことです。
よく例として挙げられる送金のプログラムで言えば、送金はしたのに途中でエラーが起きて先方まで届かなかった、なんてことがあったら大変です。そこで、トランザクションを利用してデータベースの一貫性を保つのです。
こちらの方法(context manager
形式というらしい)で実装する場合は基本的な使い方の通り。
from django.db import transaction
# トランザクションの開始
with transaction.atomic():
# データベースへの操作を実行。このブロックはすべての操作が成功した場合にのみコミットされる!
自分は適用範囲を自由に設定したかったので上記の方法で実装しましたが、settings.py
のDATABASES
にATOMIC_REQUESTS
を追加し、True
を指定してあげるとことで、一括設定することも可能です。正確にいうと、Djangoのミドルウェアとして動作し、HTTPリクエストごとにトランザクションを制御する、ということでしょう。
これでView関数の処理全体を1つのトランザクションとして管理することもできますが、この方法だと自分で作ったコマンドなどがあると反映されない点と、トラフィック量によっては性能面で非効率になることがある点の考慮が必要です。
データベースのトランザクション | Django ドキュメント | Django
ちなみに、atomic
とは不可分という意味。
データベース操作をアトミック(不可分)にしたい場合に使うのでそのような名前なのですね。