Lưu ý rằng bạn có thể muốn sử dụng with
-style cú pháp. Đoạn mã sau phải giống với đoạn mã của bạn ở trên, nhưng có nhiều pytonic hơn.
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)
hoặc với một người trang trí
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)
Tuy nhiên, điều đó không giải quyết được vấn đề bế tắc của bạn ..
Bạn có thể thành công khi giảm mức cô lập giao dịch của mình. Điều này mặc định trên mysql thành REPEATABLE READ
nó quá nghiêm ngặt đối với hầu hết các tập quán. (oracle mặc định thành READ COMMITTED
')
Bạn có thể đạt được điều này bằng cách thêm nó vào settings.py
của mình
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
}
}