Observera att du kanske vill använda den tydligare with
-stil syntax. Följande bör vara identisk med din kod ovan, men mer pytoniskt.
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 dock inte ditt dödlägesproblem...
Du kan ha framgång med att sänka din transaktionsisoleringsnivå. Detta är standard på mysql till REPEATABLE READ
vilket är för strikt för de flesta användningsområden. (oracle har som standard READ COMMITTED
')
Du kan uppnå detta genom att lägga till detta i 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
}
}