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
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 transactionfrom .models import Account, Transactiondef 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 -= amounttarget.balance += amountsource.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 Falsereturn 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