0 Tage Serie
python / intermediate
Snippet

Django atomare Transaktionsverwaltung

Der atomare Kontext-Manager umschließt Datenbankoperationen in einer Transaktion und stellt sicher, dass alle Änderungen zusammen committed werden oder keine wenn ein Fehler auftritt. Dies verhindert partielle Updates, die die Datenintegrität beschädigen würden. Die Verwendung von update_fields beschränkt das SQL UPDATE auf nur geänderte Spalten und verbessert die Leistung. Die Transaktion wird automatisch zurückgesetzt, wenn eine Exception außerhalb des with-Blocks propagiert wird.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from django.db import transaction
from decimal import Decimal
def transfer_funds(sender, receiver, amount):
with transaction.atomic():
sender.balance -= amount
sender.save(update_fields=['balance'])
receiver.balance += amount
receiver.save(update_fields=['balance'])
TransactionLog.objects.create(
from_account=sender,
to_account=receiver,
amount=amount
)
if sender.balance < 0:
raise ValueError('Insufficient funds')
def batch_import_products(products_data):
try:
with transaction.atomic():
for data in products_data:
Product.objects.create(**data)
return True
except Exception:
return False
django
Erklärung
1
with transaction.atomic():
Erstellt einen Transaktionsblock; alle Operationen succeed oder alle scheitern zusammen
2
sender.save(update_fields=['balance'])
Partiell nur das balance-Feld aktualisieren, Timestamp-Änderungen vermeiden
3
raise ValueError('Insufficient funds')
Ungefangene Exception verursacht automatisches Rollback aller Änderungen
4
except Exception:
Fängt die Rollback-Exception ab; Daten bleiben konsistent