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。