[英]Using nested Django transaction.atomic() to handle exceptions?
Django的文檔是關於transaction.atomic()
和異常的內容:
https://docs.djangoproject.com/en/1.10/topics/db/transactions/#django.db.transaction.atomic
避免在原子內部捕獲異常!
...
捕獲數據庫錯誤的正確方法是圍繞原子塊,如上所示。 如有必要,為此添加一個額外的原子塊。 這種模式的另一個優點是:它明確界定了發生異常時將回滾哪些操作。
...
“如果有必要,為此添加一個額外的原子塊”。 看起來像? 我可以這樣做還是導致“意外行為”?
valid = True
errors = []
objects = MyModel.objects.all()
try:
with transaction.atomic():
for obj in objects:
try:
# Update and save obj here...
except:
errors.append("obj {} had errors".format(obj.pk))
valid = False
if not valid:
raise Exception('batch update failed.')
except Exception as ex:
# Handle it..
他們是說這樣寫嗎? 如果是這樣,為什么會有所不同?
valid = True
errors = []
objects = MyModel.objects.all()
try:
with transaction.atomic():
for obj in objects:
try:
with transaction.atomic(): # Here's my 'extra atomic block'
# Update and save obj here...
except:
errors.append("obj {} had errors".format(obj.pk))
valid = False
if not valid:
raise Exception('batch update failed.')
except Exception as ex:
# Handle it..
Django僅在事務塊捕獲DatabaseError
(或其子類)時才觸發rolback,因此您不應在它之前捕獲它。 如果添加第二個事務塊(您的第二個示例),則會捕獲錯誤,將事務標記為回滾,然后您可以執行任何操作。
我認為您應該很好,可以再次引發完全相同的錯誤,但這只是一個猜測。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.