簡體   English   中英

使用嵌套的Django transaction.atomic()處理異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM