Pamiętaj, że możesz chcieć użyć bardziej przejrzystego with
składnia stylu. Poniższy kod powinien być identyczny z powyższym kodem, ale bardziej pytoniczny.
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)
lub z dekoratorem
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)
To jednak nie rozwiązuje problemu impasu.
Możesz odnieść sukces w obniżeniu poziomu izolacji transakcji. To domyślnie mysql to REPEATABLE READ
co jest zbyt surowe dla większości zastosowań. (Oracle domyślnie READ COMMITTED
')
Możesz to osiągnąć, dodając to do pliku 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
}
}