Django
Databastransaktioner
Sök…
Atomtransaktioner
Problem
Som standard gör Django omedelbart ändringar i databasen. När undantag inträffar under en serie åtaganden kan detta lämna din databas i ett oönskat tillstånd:
def create_category(name, products):
category = Category.objects.create(name=name)
product_api.add_products_to_category(category, products)
activate_category(category)
I följande scenario:
>>> create_category('clothing', ['shirt', 'trousers', 'tie'])
---------------------------------------------------------------------------
ValueError: Product 'trousers' already exists
Ett undantag inträffar när man försöker lägga till byxeprodukten i kategorin kläder. Vid denna punkt har kategorin själv redan lagts till och skjortprodukten har lagts till i den.
Den ofullständiga kategorin och innehållande produkt måste tas bort manuellt innan koden create_category()
metoden create_category()
gång till, för annars skulle en duplikatkategori skapas.
Lösning
Modulen django.db.transaction
låter dig kombinera flera databasändringar i en atomtransaktion :
[a] serie databasåtgärder så att antingen alla inträffar eller ingenting inträffar.
Tillämpat på ovanstående scenario kan detta tillämpas som dekoratör :
from django.db import transaction
@transaction.atomic
def create_category(name, products):
category = Category.objects.create(name=name)
product_api.add_products_to_category(category, products)
activate_category(category)
Eller genom att använda en context manager :
def create_category(name, products):
with transaction.atomic():
category = Category.objects.create(name=name)
product_api.add_products_to_category(category, products)
activate_category(category)
Om ett undantag inträffar i något skede i transaktionen kommer inga databasändringar att genomföras.