Observe que você pode querer usar o
with
mais claro -sintaxe de estilo. O seguinte deve ser idêntico ao seu código acima, mas mais pytonic. 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 com um decorador
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)
Isso não resolve seu problema de deadlock embora ..
Você pode ter sucesso com a redução do nível de isolamento da transação. Este padrão no mysql é
REPEATABLE READ
que é muito rigoroso para a maioria dos usos. (o padrão oracle é READ COMMITTED
') Você pode conseguir isso adicionando isso ao seu
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
}
}