初心者のためのDjango入門
■第6話:Djangoのデータベース、トランザクション機能
(最終更新日:2023.01.07)
(絵が小さい場合はスマホを横に)
「トランザクション機能とは?」
Djangoに限らずデータベースを扱っていれば、排他処理とトランザクション機能は必ず必要になる。
今回はDjangoにおけるトランザクション機能の実装方法を紹介する。
1.トランザクション機能とは
まずは、トランザクション自体について説明する。
トランザクションとは2つ以上の一連の処理が途中で終了した場合、処理を取り消す機能である。
なぜ、このような機能が必要かを以下の例で説明する。
例えば、口座の振込処理で、お婆さんから孫へ20万円振り込むとする。
その時「①お婆さんの口座から-20万円」「②孫の口座へ+20万円」という2つの処理が行われる。
この際、①の処理が終わったところで停電等が起こり、②の処理が行われなかったとする。
②の処理が行われなかった際、①の処理を取り消すという機能がないと、お婆さんの20万円が振り込まれないまま消失することになる。
このような不具合をなくすためにトランザクション機能が必要になる。
ちなみに、処理を取り消す動作をロールバックと言う。
トランザクションが有効な例
2.トランザクション機能の3つの実装方法
次にDjangoでトランザクション機能を実装する方法を紹介する。 Djangoでトランザクション機能を実装するには、3つの方法がある。
- デコレーターを用いる方法(@transaction.atomic)
- withを使う方法(with transaction.atomic())
- setting.pyで設定する方法(ATOMIC_REQUESTS)
下記にそれらの例を示す。1は左上に当たる。
処理を行っているViewの関数に、@transaction.atomicを付けるだけである。
2は右上に当たる。with句でtransaction.atomic()を用いる。
3はsetting.pyのDATABASEの項目にATOMIC_REQUESTSをTrueにする。
3の場合は注意が必要で、全ての処理に対してtransaction処理が有効になってしまう。
トランザクションを適用したくないViewには、@transaction.non_atomic_requestsをデコレーターで付与する必要がある。
個人的にはtransaction処理を行っていることが明確な1か 2がおすすめである。
トランザクションの実装方法
1.デコレーター(左上)、2.with(右上)、3.setting.py(左下)
▼参考図書、サイト
【Django】トランザクションの設定方法 DjangoBrothers BLOG
djangoでアトミックトランザクションを使ってみる 日々報道