Green Screen

Djangoのトランザクション処理

戻る

このサイトの記事、「見出し-記事詳細」と「見出し-タグ」が1対多の
複数データになっているが、データベースのトランザクション処理をしていなかった。

ーートランザクション処理、とは?ーー
ざっくりいうと、複数の処理をまとめて1つにする。ということ。
データベース(とくにRDBMS:リレーショナルデータベースと呼ばれるもの)の機能。
よく出るたとえとしては、
「レシートの1商品の金額を訂正したのに、レシートの合計金額は直していない」
等の、連動していないと矛盾するデータの一部分だけ変更されている半端な状態が
起こらないようにする、という機能。(Excelで仕事していたら、半端な訂正、
経験したことあると思う。)

この「トランザクション処理」、
Djangoフレームワークだと、こんな修正だけで終わった。
# views.py(直した部分)
from django.db import transaction # ★追加
(中略)

def post_new(request):
(中略)
with transaction.atomic(): # ★追加
post = form_post.save(commit=False)
post.created_dt = timezone.now()
post.updated_dt = timezone.now()
post.author = request.user
post.save()
form_post.save_m2m()

formset.instance = post
formset.save()
============================================
全文掲載は難儀なので中略したが、追記したのは★の2行だけ。

昔職場でやったVB.netでは、うろ覚えだけど、だいたいこんな構成要素が必要だった。
==================================================================
Try
BeginTransaction
(更新処理をつらつらと書く)
Commit '←これを忘れると特定のデータがロックされっぱなし&更新されない恐れ。
Catch XXXX
Rollback 'エラーの時
FINALLY
EndTransaction '←これも忘れるとずっとロックされる恐れが。
==================================================================
骨組みだけでだいたいこんなパーツが必要だった。
python × Djangoのプログラミングはほんと能率化されているんだな。

作成日: 2025年7月6日23:35

更新日: 2025年7月6日23:39

タグ

戻る