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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow