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
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 transactionfrom decimal import Decimaldef transfer_funds(sender, receiver, amount):with transaction.atomic():sender.balance -= amountsender.save(update_fields=['balance'])receiver.balance += amountreceiver.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 Trueexcept 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