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。

  • 相关阅读:
    bzoj1027
    bzoj1069
    poj2079
    poj2187
    bzoj2281
    bzoj2285
    bzoj1558
    bzoj1822
    bzoj1559
    bzoj1570
  • 原文地址:https://www.cnblogs.com/wjun0/p/14820735.html
Copyright © 2011-2022 走看看