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。

  • 相关阅读:
    Vue项目中跨域问题解决
    子网掩码
    C++的const类成员函数
    在python3中使用urllib.request编写简单的网络爬虫
    Linux 重定向输出到多个文件中
    背包问题
    hdu-1272 小希的迷宫
    SQLAlchemy 几种查询方式总结
    pycharm快捷键、常用设置、配置管理
    python3判断字典、列表、元组为空以及字典是否存在某个key的方法
  • 原文地址:https://www.cnblogs.com/wjun0/p/14820735.html
Copyright © 2011-2022 走看看