Django の TRANSACTION を活用してデータの整合性を管理する方法を解説。atomic(), savepoint(), select_for_update() の使い方を紹介。
トランザクションは、データベースにおける一連の処理を「ひとまとまりの処理」として扱う仕組みです。
銀行の振込処理のように、すべての処理が成功するか、すべてを取り消すかのどちらかである必要がある場合に使用します。
Django では、atomic()
, savepoint()
, select_for_update()
などを使ってトランザクションを管理できます。
atomic()
を使ったトランザクション管理Django では atomic()
を使ってトランザクションを管理できます。
atomic()
を使った安全なデータ更新PYTHONfrom django.db import transaction @transaction.atomic def transfer_funds(sender, receiver, amount): sender.balance -= amount sender.save() receiver.balance += amount receiver.save()
もし sender.save()
の後にエラーが発生した場合、変更がロールバックされます。
savepoint()
を使った部分的なロールバックsavepoint()
を使うと、一部の処理だけをロールバックできます。
savepoint()
を使った部分的なトランザクション管理PYTHONfrom django.db import transaction with transaction.atomic(): transaction.savepoint() user = User.objects.create(name="Taro") try: order = Order.objects.create(user=user, amount=10000) except Exception: transaction.savepoint_rollback()
この例では、Order
の作成に失敗した場合でも User
の作成は維持されます。
select_for_update()
を使った排他ロックselect_for_update()
を使うと、同時に更新されるデータの競合を防ぐことができます。
select_for_update()
を使った安全なデータ更新PYTHONfrom django.db import transaction def update_balance(user_id, amount): with transaction.atomic(): user = User.objects.select_for_update().get(id=user_id) user.balance += amount user.save()
この方法では、同じ user
を複数の処理が同時に更新しようとすると、ロックがかかりデータの不整合を防ぎます。
機能 | SQLite | PostgreSQL |
---|---|---|
atomic() | あり | あり |
savepoint() | あり | あり |
select_for_update() | 制限あり | あり(高機能) |
SERIALIZABLE トランザクション | 制限あり | あり(高い整合性を確保) |
atomic()
を使うとトランザクションを安全に実行可能savepoint()
で部分的なロールバックを実現select_for_update()
でデータの競合を防ぐ回 | タイトル | リンク |
---|---|---|
第 1 回 | Django ORM と SQL の関係 | 詳 細 |
第 2 回 | モデル定義とマイグレーション | 詳 細 |
第 3 回 | ORM のクエリ最適化と SQL チューニング | 詳 細 |
第 4 回 | JOIN と GROUP BY を活用したデータ分析 | 詳 細 |
第 5 回 | INDEX の活用とパフォーマンス最適化 | 詳 細 |
第 6 回 | TRANSACTION を使ったデータ整合性の管理 | この記事 |
第 7 回 | VIEW を使った仮想テーブルの活用 | 詳 細 |
当サイトの情報は、一般的な参考情報として提供しております。
正確な情報の掲載に努めておりますが、その内容の正確性・完全性・最新性を保証するものではありません。
記事の内容をご利用の際は、ご自身の責任において判断し、必要に応じて専門家にご相談ください。
当サイトの情報の利用により生じたいかなる損害についても、一切の責任を負いかねますのでご了承ください。
※ 本ページでは、著作権法に基づき、適正な引用の範囲内でコンテンツを紹介しています。
オリジナルの情報は発信元をご確認ください。
もし問題がありましたら、こちら からお問い合わせください。