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。

原文地址:https://www.cnblogs.com/wjun0/p/14820735.html