ฉันเชื่อว่าคำตอบของ @ AnujGupta นั้นถูกต้อง อย่างไรก็ตามการย้อนกลับสามารถเพิ่มข้อยกเว้นที่คุณควรจับและจัดการ:
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
สุดท้ายคุณสามารถ prettify โดยใช้มัณฑนากรที่ปกป้องวิธีการที่ใช้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()
เป็นวิธีการแยกในกรณีที่คุณจำเป็นต้องใช้มันด้วยตนเองสำหรับกรณีที่จำเป็นต้องมีการจัดการที่เฉพาะเจาะจงและการจัดการมัณฑนากรทั่วไปไม่เพียงพอ