@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
마지막으로 다음을 사용하는 메소드를 보호하는 데코레이터를 사용하여이를 확인할 수 있습니다 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()
특정 처리가 필요하고 일반 데코레이터 처리가 충분하지 않은 경우 수동으로 사용해야하는 경우 추출 방법 으로 유지하는 것이 여전히 편리합니다 .