मेरा मानना है कि @ अनुजगुप्त का उत्तर सही है। हालाँकि रोलबैक खुद एक अपवाद उठा सकता है जिसे आपको पकड़ना चाहिए और संभालना चाहिए:
from django.db import transaction, DatabaseError
try:
a.save()
except DatabaseError:
try:
transaction.rollback()
except transaction.TransactionManagementError:
# Log or handle otherwise
यदि आप पाते हैं कि आप इस कोड को विभिन्न save()
स्थानों पर लिख रहे हैं , तो आप अर्क-विधि कर सकते हैं:
import traceback
def try_rolling_back():
try:
transaction.rollback()
log.warning('rolled back') # example handling
except transaction.TransactionManagementError:
log.exception(traceback.format_exc()) # example handling
अंत में, आप एक डेकोरेटर का उपयोग करके इसे पूर्व निर्धारित कर सकते हैं जो उपयोग करने वाले तरीकों की रक्षा करता है save()
:
from functools import wraps
def try_rolling_back_on_exception(fn):
@wraps(fn)
def wrapped(*args, **kwargs):
try:
return fn(*args, **kwargs)
except:
traceback.print_exc()
try_rolling_back()
return wrapped
@try_rolling_back_on_exception
def some_saving_method():
# ...
model.save()
# ...
यहां तक कि अगर आप ऊपर के डेकोरेटर को लागू करते हैं, तब भी यह try_rolling_back()
एक सुविधाजनक विधि के रूप में रखना सुविधाजनक है, अगर आपको इसे उन मामलों के लिए मैन्युअल रूप से उपयोग करने की आवश्यकता है जहां विशिष्ट हैंडलिंग की आवश्यकता होती है, और जेनेरिक डेकोरेटर हैंडलिंग पर्याप्त नहीं है।