Perhatikan bahwa Anda mungkin ingin menggunakan with
yang lebih jelas -gaya sintaks. Berikut ini harus identik dengan kode Anda di atas, tetapi lebih 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)
atau dengan dekorator
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)
Itu tidak menyelesaikan masalah kebuntuan Anda..
Anda mungkin berhasil menurunkan tingkat isolasi transaksi Anda. Ini default pada mysql ke REPEATABLE READ
yang terlalu ketat untuk sebagian besar penggunaan. (default oracle ke READ COMMITTED
')
Anda dapat mencapainya dengan menambahkan ini ke settings.py
. Anda
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
}
}