zoukankan      html  css  js  c++  java
  • django事务transation使用注意事项

    1,django 使用事务基础:

    方法一:(不推荐使用,这样整个视图都在事务中)

    class TransactionTestAPI(APIView):
        @transaction.atomic()
        def get(self,request):
            print("逻辑代码")
            return Response({"message": "ok"})

    方法二:(推荐使用)

    class TransactionTestAPI(APIView):
        def get(self,request):
            with transaction.atomic():
                print("逻辑代码")
            return Response({"message": "ok"})

    注意事项 1:(如果django使用了多张表,需要指定使用那张表回滚,如果不指定默认是回滚default的表)

    class TransactionTestAPI(APIView):
        def get(self,request):
            try:
                with transaction.atomic(using='db2'):
                    point_id = transaction.savepoint()
    
                    transaction_test = "transaction_test"
                    info = {
                        'name': "transaction_test",
                        "age": "1112",
                        'email': "111@111.com"
                    }
                    data = Db2_users.objects.create(**info)
                    print(data.id)
                    d = Db2_users.objects.filter(name=transaction_test).first()
                    print(d.name)
                    print(1/0)
            except:
                print("error")
            return Response({"message":"ok"})

    注意事项二:在with transaction.atomic()中使用try except 时,在try中的代码不会在事务中,代码不会回滚。

    class TransactionTestAPI(APIView):
        def get(self,request):
            num = 1
            with transaction.atomic(using='db2'):
                point_id = transaction.savepoint()
                try:       # try 中的代码不会在事务中
                    num += 1
                    transaction_test = "transaction_test"
                    info = {
                        'name': "transaction_test",
                        "age": "1112",
                        'email': "111@111.com"
                    }
                    data = Db2_users.objects.create(**info)
                    print(data.id)
                    d = Db2_users.objects.filter(name=transaction_test).first()
                    print(d.name)
                    print(1/0)          #  触发异常回滚
                except:
                    print("error")
                    transaction.savepoint_rollback(point_id)  # 即使使用回滚,因为在try中,所以不会回滚
            print(num)  # 在事务中的修改即使事务回滚了,对变量的修改也不会回滚,只会回滚对数据库的操作
            return Response({"message":"ok"})

    注意事项三:在事务中的变量修改了,即使回滚了事务,变量的修改也是生效的,因为事务只会回滚对数据库的操作。如上面的num。

  • 相关阅读:
    [转载]写作经验谈--如何写一本书?
    决定写一本书
    c中自定义函数通过sizeof来输出数组的长度为何不正确?【原创】
    [转]关于PHP的漏洞以及如何防止PHP漏洞?
    [转]PHP安全之防止你的源代码或重要配置信息暴露在外
    PHPUnit 单元测试框架(鸡肋)
    [转]避免PHP-FPM内存泄漏导致内存耗尽
    [转]PHP ffmpeg截取视频指定帧为图片,获取rotation信息并旋转
    ThinkPHP 缓存 以及Zend OPCache提升PHP性能
    简单测漏 语句
  • 原文地址:https://www.cnblogs.com/wjun0/p/14820735.html
Copyright © 2011-2022 走看看