django的事务

在某些时候,你可能会在视图修改两张数据表。并且想让他们同时成功或者同时失败。这就是事务的原子性(atomicity)。在django中应该怎么做呢?

详细可以参考官方文档:https://yiyibooks.cn/xx/Django_1.11.6/topics/db/transactions.html

这里简单地记录一下:

1.装饰器方式实现

@transaction.atomic
    def viewfunc(request):
        # 这些代码会在一个事务中执行
        ...

 

2.with语句方式实现

def viewfunc(request):
        # 这部分代码不在事务中,会被Django自动提交
        ...
        with transaction.atomic():
            # 这部分代码会在事务中执行
            ...    

 

但是这两种方式还不够完善,因为代码写在事务中,如果代码块执行过程中抛出异常,则django会自动回滚事务。如果代码块执行完毕没有抛出异常,则django会自动提交事务。但是!!!开发者不能调用代码来手动提交或回滚事务,这就很不方便。

这时候需要引入保存点这个东西。

使用保存点,可以实现回滚事务的一部分,而不是回滚整个事务操作。而且,可以手动提交事务或者回滚事务。

from django.db import transaction

    # 开启事务
    @transaction.atomic
    def viewfunc(request):
        a.save()    
        
        # 现在事务中包含了 a.save() 操作
        save_id = transaction.savepoint()   # 创建了一个保存点
        
        b.save()    
        
        # 现在事务中包含了 a.save()和b.save() 操作
        transaction.savepoint_rollback(save_id)   # b.save()的执行结果将被回滚
        
        # 提交事务, a.save()生效, b.save()回滚
        transaction.savepoint_commit(save_id)

 

posted @ 2018-12-02 19:31  苦瓜爆炒牛肉  阅读(227)  评论(0编辑  收藏  举报