zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    3.4 抓取猫眼电影排行
    2.5 代理的基本原理
    第二章 爬虫基础
    1.8 爬虫框架的安装
    Python序列化
    CVE-2020-1938 Apache-Tomcat-Ajp漏洞复现
    Python定制类
    Apache Tomcat DDOS
    内网端口转发工具
    内网渗透思路简单介绍
  • 原文地址:https://www.cnblogs.com/chichung/p/10054757.html
Copyright © 2011-2022 走看看