zoukankan      html  css  js  c++  java
  • django中如何处理事务

    生成订单时,一次性生成多条数据记录或者一次性操作多个模型,都有可能产生中途报错的情况,所以需要在生成订单时保证多个数据操作的原子性。

    事务

    在完成一个整体功能时,操作到了多个表数据,或者同一个表的多条记录,如果要保证这些sql语句操作作为一个整体保存到数据库中,那么可以使用事务(transation)
    事务具有4个特征,5个隔离等级
    四个特性:一致性,原子性,隔离性,持久性
    # 隔离性: 两个事务的隔离性,隔离性的修改可以通过数据库的配置文件进行修改
    五个隔离级别: 串行隔离,可重复读,已提交读,未提交读,没有隔离级别
        原子性(Atomicity)
        一致性(Consistency)
        隔离性(Isolation)[事务隔离级别->幻读,脏读]
        持久性(Durability)
    在mysql中有专门的SQl语句来完成事务的操作,事务操作一般有3个步骤:
    		设置事务开始  start transation; egin;
    		事务的处理[增删改]
    		设置事务的回滚或者提交 rollback / commit
     mysql 存储过程 异常捕获来完成自动回滚
    在 django等web框架中,只要ORM模型,一般都会实现了事务操作封装
    所以在django中我们可以直接使用ORM模型提供的事务操作方法即可完成事务的操作
    

    django框架中操作事务的方法

    方法一

    from django.db import transaction  # 先导入处理事务的transaction模块
    from rest_framework.views import APIView
    class OrderAPIView(APIView):
          @transaction.atomic   #开启事务,当方法执行完成以后,自动提交事务
          def post(self,request):
                ...
    

    方法二

    from django.db import transaction
    from rest_framework.views import APIView
    class OrderAPIView(APIView):
          def post(self, request):
                ...
                with transaction.atomic() # 开始事务,当with语句执行完成以后,自动提交事务
                      # 数据库操作
                      ....
    

    在使用事务过程中,有时候会出现异常,当出现异常的时候,我们需要让程序停止下来,同时需要回滚事务

    from django.db import transaction
    from rest_framework.views import APIView
    class OrderAPIView(APIView):
          def post(self, request):
                ...
                with transaction.atomic():
                      # 设置事务回滚的标记点
                      sid = transaction.savepoint()
                      ...
                      try:
                            ...
                      except:
                            transaction.savepoint_rollback(sid) #回滚到标记点
    

    -------------------------------------------

    个性签名:代码过万,键盘敲烂!!!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    浮点数
    opencv笔记-GFTTDetector
    有向图与关联矩阵
    亚像素角点
    字符串格式化输出
    字符串表示与转换
    Bresenham算法
    罗德里格斯公式
    模型调参
    jave 逻辑运算 vs 位运算 + Python 逻辑运算 vs 位运算
  • 原文地址:https://www.cnblogs.com/weiweivip666/p/13735112.html
Copyright © 2011-2022 走看看