django的事务

Posted chichung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于django的事务的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django Summernote 中显示编程片段的代码块?

Django - 保持基于 save() 的事务简短

理解片段事务期间片段的生命周期方法调用

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django中数据库事务的处理