Notez que vous voudrez peut-être utiliser le with
plus clair -style syntaxe. Ce qui suit devrait être identique à votre code ci-dessus, mais plus pytonique.
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)
ou avec un décorateur
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)
Cela ne résout cependant pas votre problème de blocage..
Vous pourriez réussir à réduire votre niveau d'isolement des transactions. Ceci par défaut sur mysql à REPEATABLE READ
qui est trop strict pour la plupart des usages. (Oracle par défaut est READ COMMITTED
')
Vous pouvez y parvenir en ajoutant ceci à votre 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
}
}