Имайте предвид, че може да искате да използвате по-ясния with
-стилов синтаксис. Следното трябва да е идентично с вашия код по-горе, но по-питонично.
from django.db import transaction
from __future__ import with_statement
def process(self, db, data):
with transaction.commit_on_success(using=db):
# do things with my_objects...
for obj in my_objects:
obj.save(using=db)
или с декоратор
from django.db import transaction
@transaction.commit_on_success(using=db)
def process(self, db, data):
# do things with my_objects...
for obj in my_objects:
obj.save(using=db)
Това обаче не решава проблема ви с безизходица...
Може да имате успех с понижаването на нивото на изолация на вашата транзакция. Това по подразбиране в mysql е REPEATABLE READ
което е твърде строго за повечето употреби. (oracle по подразбиране е READ COMMITTED
')
Можете да постигнете това, като добавите това към вашия settings.py
MYSQL_DATABASE_OPTIONS = {'init_command': 'SET storage_engine=INNODB; SET
SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;'}
DATABASES = {
'default': { # repeat for each db
'ENGINE': ... etc
...
...
'OPTIONS': MYSQL_DATABASE_OPTIONS
}
}