ध्यान दें कि आप अधिक स्पष्ट with
का उपयोग करना चाह सकते हैं -स्टाइल सिंटैक्स। निम्नलिखित आपके उपरोक्त कोड के समान होना चाहिए, लेकिन अधिक पाइटोनिक होना चाहिए।
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)
या डेकोरेटर के साथ
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)
हालांकि इससे आपकी गतिरोध की समस्या का समाधान नहीं होता..
आपको अपने लेन-देन अलगाव स्तर को कम करने में सफलता मिल सकती है। यह mysql पर डिफ़ॉल्ट रूप से REPEATABLE READ
. पर निर्भर करता है जो अधिकांश उपयोगों के लिए बहुत सख्त है। (ओरेकल डिफ़ॉल्ट रूप से READ COMMITTED
')
आप इसे अपने 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
}
}