python / expert
Snippet
Django Atomare Transaktionsblöcke mit Savepoint-Verwaltung
Atomare Transaktionen gewährleisten Datenintegrität, wenn mehrere Datenbankoperationen zusammen erfolgreich sein oder fehlschlagen müssen. Savepoints erstellen verschachtelte Transaktionspunkte innerhalb eines größeren atomaren Blocks und ermöglichen partielle Rollbacks ohne Abbruch der gesamten Transaktion. Dieses Muster ist entscheidend für Finanzoperationen, bei denen ein Fehler in einem nicht-kritischen Schritt (wie dem Senden einer Benachrichtigung) nicht den tatsächlichen Saldotransfer zurücksetzen sollte.
snippet.py
1
2
from django.db import transaction\nfrom decimal import Decimal\n\nclass OrderProcessor:\n def process_transfer(self, from_account, to_account, amount):\n with transaction.atomic():\n savepoint = transaction.savepoint()\n try:\n self._deduct_balance(from_account, amount)\n self._apply_transaction_fee(from_account)\n self._credit_balance(to_account, amount)\n self._send_notifications(from_account, to_account)\n except Exception as e:\n transaction.savepoint_rollback(savepoint)\n self._log_failure(from_account, to_account, str(e))\n raise\n else:\n transaction.savepoint_commit(savepoint)\n\n def _deduct_balance(self, account, amount):\n updated = Account.objects.filter(\n id=account.id,balance__gte=amount\n ).update(balance=F('balance') - amount)\n if not updated:\n raise InsufficientFundsError(account, amount)\n\n def _credit_balance(self, account, amount):\n Account.objects.filter(id=account.id).update(\n balance=F('balance') + amount\n )
django
Erklärung
1
with transaction.atomic():
Erstellt äußersten atomaren Block, der sicherstellt, dass alle Operationen zusammen als eine einzige DB-Transaktion erfolgreich sind oder fehlschlagen
2
savepoint = transaction.savepoint()
Erstellt Zwischen-Rollback-Punkt, der partiellen Rollback verschachtelter Operationen ermöglicht, während die äußere Transaktion aktiv bleibt
3
transaction.savepoint_rollback(savepoint)
Setzt Datenbankzustand auf Savepoint zurück bei Exception, verwirft nur die fehlgeschlagene Operation statt des gesamten atomaren Blocks
4
filter(balance__gte=amount).update()
Atomare Abzugsoperation mit optimistischer Sperrprüfung stellt sicher, dass Race Conditions keine negativen Salden verursachen können