TRANSACTION を使ったデータ整合性の管理

Django × SQL

日付:2025年3月11日

Django の TRANSACTION を活用してデータの整合性を管理する方法を解説。atomic(), savepoint(), select_for_update() の使い方を紹介。

目 次

1. トランザクションとは?

トランザクションは、データベースにおける一連の処理を「ひとまとまりの処理」として扱う仕組みです。
銀行の振込処理のように、すべての処理が成功するか、すべてを取り消すかのどちらかである必要がある場合に使用します。

Django では、atomic(), savepoint(), select_for_update() などを使ってトランザクションを管理できます。

2. atomic() を使ったトランザクション管理

Django では atomic() を使ってトランザクションを管理できます。

例:atomic() を使った安全なデータ更新

PYTHON
from django.db import transaction @transaction.atomic def transfer_funds(sender, receiver, amount): sender.balance -= amount sender.save() receiver.balance += amount receiver.save()

もし sender.save() の後にエラーが発生した場合、変更がロールバックされます。

3. savepoint() を使った部分的なロールバック

savepoint() を使うと、一部の処理だけをロールバックできます。

例:savepoint() を使った部分的なトランザクション管理

PYTHON
from 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 の作成は維持されます。

4. select_for_update() を使った排他ロック

select_for_update() を使うと、同時に更新されるデータの競合を防ぐことができます。

例:select_for_update() を使った安全なデータ更新

PYTHON
from 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 を複数の処理が同時に更新しようとすると、ロックがかかりデータの不整合を防ぎます。

5. SQLite と PostgreSQL のトランザクションの違い

機能SQLitePostgreSQL
atomic()ありあり
savepoint()ありあり
select_for_update()制限ありあり(高機能)
SERIALIZABLE トランザクション制限ありあり(高い整合性を確保)

6. まとめ

  • atomic() を使うとトランザクションを安全に実行可能
  • savepoint() で部分的なロールバックを実現
  • select_for_update() でデータの競合を防ぐ
  • PostgreSQL では高機能なトランザクション制御が可能