Bemærk, at du måske vil bruge den mere klare with
-stil syntaks. Følgende burde være identisk med din kode ovenfor, men mere pytonisk.
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)
eller med en dekoratør
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)
Det løser dog ikke dit deadlock problem...
Du kan få succes med at sænke dit transaktionsisolationsniveau. Dette er standard på mysql til REPEATABLE READ
hvilket er for strengt til de fleste anvendelser. (oracle er som standard READ COMMITTED
')
Du kan opnå dette ved at tilføje dette til din 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
}
}