আমি বিশ্বাস করি @ অনুজগুপ্তের উত্তরটি সঠিক। তবে রোলব্যাক নিজেই একটি ব্যতিক্রম বাড়াতে পারে যা আপনার ধরা ও পরিচালনা করতে হবে:
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()
সুনির্দিষ্ট হ্যান্ডলিংয়ের প্রয়োজন হয় এবং জেনেরিক ডেকোরেটর হ্যান্ডলিং যথেষ্ট নয় এমন ক্ষেত্রে যদি আপনাকে এটি ম্যানুয়ালি ব্যবহার করতে হয় তবে এটি একটি নিষ্কাশন পদ্ধতি হিসাবে রাখা এখনও সুবিধাজনক ।