0 Tage Serie
python / intermediate
Snippet

Django Datenbank-Transaktionen mit atomic()

atomic() stellt sicher, dass alle Operationen erfolgreich sind oder alle gemeinsam fehlschlagen - entscheidend für Finanzdaten. select_for_update() sperrt Zeilen um Race Conditions während gleichzeitiger Änderungen zu verhindern.

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
from django.db import transaction
from .models import Account, Transaction
def transfer_funds(source_id, target_id, amount):
try:
with transaction.atomic():
source = Account.objects.select_for_update().get(id=source_id)
target = Account.objects.select_for_update().get(id=target_id)
if source.balance < amount:
raise ValueError('Insufficient funds')
source.balance -= amount
target.balance += amount
source.save()
target.save()
Transaction.objects.create(
account=source,
amount=-amount,
transaction_type='TRANSFER'
)
Transaction.objects.create(
account=target,
amount=amount,
transaction_type='TRANSFER'
)
except ValueError:
return False
return True
django
Erklärung
1
transaction.atomic()
Erstellt einen Transaktionsblock mit Rollback bei Fehler
2
select_for_update()
Sperrt ausgewählte Zeilen bis Transaktion abgeschlossen
3
raise ValueError()
Löst automatischen Rollback bei unzureichenden Mitteln aus