Všimněte si, že možná budete chtít použít jasnější with
-syntaxe stylu. Následující text by měl být stejný jako váš výše uvedený kód, ale více pytonický.
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)
nebo s 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)
To však neřeší váš problém se zablokováním..
Možná budete mít úspěch se snížením úrovně izolace transakcí. Toto výchozí nastavení na mysql je REPEATABLE READ
což je pro většinu použití příliš přísné. (výchozí nastavení Oracle je READ COMMITTED
')
Můžete toho dosáhnout přidáním tohoto do 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
}
}