Beachten Sie, dass Sie vielleicht das deutlichere with
verwenden möchten -Stil-Syntax. Das Folgende sollte mit Ihrem obigen Code identisch sein, aber pytonischer.
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)
oder mit einem Dekorateur
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)
Das löst jedoch nicht Ihr Deadlock-Problem..
Möglicherweise haben Sie Erfolg, wenn Sie Ihre Transaktionsisolationsstufe verringern. Dies ist bei mysql standardmäßig REPEATABLE READ
was für die meisten Anwendungen zu streng ist. (Oracle verwendet standardmäßig READ COMMITTED
')
Sie können dies erreichen, indem Sie dies zu Ihrer settings.py
hinzufügen
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
}
}