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。

  • 相关阅读:
    Javascript
    读jQuery源码
    常用正则-(各种数字,不能包括特殊字符等,后续再补充)
    SpringBoot入门教程(二) Spring Boot配置第二章
    Mybatis面试题
    HTTP和socket的连接请求的区别
    Maven有哪些优点和缺点
    @Autowired 与@Resource的区别(详细)
    spring的优点与缺点
    SpringMVC常见面试题总结
  • 原文地址:https://www.cnblogs.com/wjun0/p/14820735.html
Copyright © 2011-2022 走看看