LoginSignup
1
1

【Django】with transaction.atomic()でトランザクションを利用する場合

Posted at

概要

Djangoでは、デフォルトではトランザクションは利用されません(オートコミットモード)。
そこで、Django ORMが提供しているデータベーストランザクションを使いましたので紹介します。

with transaction.atomic():とは

transaction.atomic()ブロック内のコードは、トランザクション内で実行されます。つまり、一連のデータベース操作がすべて成功した場合にのみコミットされ、途中でエラーが発生した場合にはロールバックされる、と言うことです。
よく例として挙げられる送金のプログラムで言えば、送金はしたのに途中でエラーが起きて先方まで届かなかった、なんてことがあったら大変です。そこで、トランザクションを利用してデータベースの一貫性を保つのです。

こちらの方法(context manager形式というらしい)で実装する場合は基本的な使い方の通り。

from django.db import transaction

# トランザクションの開始
with transaction.atomic():
    # データベースへの操作を実行。このブロックはすべての操作が成功した場合にのみコミットされる!

自分は適用範囲を自由に設定したかったので上記の方法で実装しましたが、settings.pyDATABASESATOMIC_REQUESTSを追加し、Trueを指定してあげるとことで、一括設定することも可能です。正確にいうと、Djangoのミドルウェアとして動作し、HTTPリクエストごとにトランザクションを制御する、ということでしょう。
これでView関数の処理全体を1つのトランザクションとして管理することもできますが、この方法だと自分で作ったコマンドなどがあると反映されない点と、トラフィック量によっては性能面で非効率になることがある点の考慮が必要です。
データベースのトランザクション | Django ドキュメント | Django

ちなみに、atomicとは不可分という意味。
データベース操作をアトミック(不可分)にしたい場合に使うのでそのような名前なのですね。

参考

【Django】トランザクションの設定方法

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1