簡體   English   中英

Django模型:在不推薦使用commit_manually時管理事務

[英]Django models: managing transactions when commit_manually is deprecated

我正在運行Django 1.4.11。 我以類似於以下代碼的方式覆蓋Django模型的save()方法:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    @transaction.commit_manually
    def save(self, *args, **kwargs):
        try:
            super(self.__class__, self).save(*args, **kwargs)
            foo() # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

當我運行我的代碼時,有時我會在Apache日志中閱讀此消息:

RemovedInDjango18Warning:commit_manually已棄用,支持set_autocommit。

如何使用set_autocommit實現相同的邏輯?

相同的邏輯看起來像這樣:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    def save(self, *args, **kwargs):
        transaction.set_autocommit(False)
        try:
            super(MyModel, self).save(*args, **kwargs)
            foo() # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()
        finally:
            transaction.set_autocommit(True)

但是,這相當於使用atomic()裝飾器:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    @transaction.atomic
    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        foo() # do_other_things

這將在成功__exit__上提交事務,並在異常情況下回滾。

對於您給出的示例,您可以使用transaction.atomic 如果代碼成功,則將提交整個事務。 如果存在異常,則將回滾更改。

@transaction.atomic
def save(self, *args, **kwargs):
    super(self.__class__, self).save(*args, **kwargs)
    foo() # do_other_things

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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