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.