c 语言可以做网站吗,建立网站的英语,企业策划书ppt,北京口碑最好的it培训机构Django 默认的事务行为是自动提交#xff0c;除非事务正在执行#xff0c;否则每个查询将会马上自动提交到数据库。
1. 全局开启事务
在 Web 里#xff0c;处理事务比较常用的方式是将每个请求封装在一个事务中。 在你想启用该行为的数据库中#xff0c;把 settings 配置…Django 默认的事务行为是自动提交除非事务正在执行否则每个查询将会马上自动提交到数据库。
1. 全局开启事务
在 Web 里处理事务比较常用的方式是将每个请求封装在一个事务中。 在你想启用该行为的数据库中把 settings 配置数据库中的参数 ATOMIC_REQUESTS 设置为 True。
DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: testdb, USER: root, PASSWORD: 123, HOST: 127.0.0.1, PORT: 3306, ATOMIC_REQUESTS: True # 全局开启事务和http请求的整个过程绑定在一起}
}它是这样工作的在调用视图方法前Django 先生成一个事务。如果响应能正常生成Django 会提交该事务。而如果视图出现异常Django 则会回滚该事务。
如果你全局开启了事务你仍然可以使用 non_atomic_requests 装饰器让某些视图方法不受事务控制但需要注意的是该装饰器仅作用于视图本身时才会生效在DRF的viewset中不生效。
from django.db import transactiontransaction.non_atomic_requests
def trans2():valid_data_test {gender: male, birth: 2020-10-01, tele: 18812341234, addr: 南京市雨花台区}res_test AuthorDetail.objects.create(**valid_data_test)res_test 1return Response(statusHTTP_202_ACCEPTED, data{msg: insert success})视图请求trans2被 transaction.non_atomic_requests 装饰不受全局事务配置的控制。class AuthorViewSet(viewsets.ModelViewSet):serializer_class AuthorDetailSerializertransaction.non_atomic_requestsaction(methodspost, detailFalse)def trans(self, request):serializer self.get_serializer(datarequest.data)if serializer.is_valid(raise_exceptionTrue):valid_data serializer.validated_dataAuthorDetail.objects.create(**valid_data)return Response(statusHTTP_202_ACCEPTED, data{msg: insert success})DRF的视图函数即使被 transaction.non_atomic_requests 装饰但是依旧被全局事务配置所控制所以说 non_atomic_requests 仅作用于视图本身时才会生效。2 局部开启事务
Django项目中局部开启事务可以借助于transaction.atomic方法。使用它我们就可以创建一个具备原子性的代码块一旦代码块正常运行完毕所有的修改会被提交到数据库。反之如果有异常更改会被回滚。
两种方式对某个请求使用事务
class AuthorViewSet(viewsets.ModelViewSet):serializer_class AuthorDetailSerializertransaction.atomicaction(methodspost, detailFalse)def trans(self, request):serializer self.get_serializer(datarequest.data)if serializer.is_valid(raise_exceptionTrue):valid_data serializer.validated_dataAuthorDetail.objects.create(**valid_data)return Response(statusHTTP_202_ACCEPTED, data{msg: insert success})transaction.atomic
def trans2():valid_data_test {gender: male, birth: 2020-10-01, tele: 18812341234, addr: 南京市雨花台区}res_test AuthorDetail.objects.create(**valid_data_test)res_test 1return Response(statusHTTP_202_ACCEPTED, data{msg: insert success})对请求中的某个代码块使用事务
with transaction.atomic():AuthorDetail.objects.create(**valid_data_test)3. 显式开启保存点
在事务操作中我们还会经常显式地设置保存点(savepoint)。一旦发生异常或错误我们使用savepoint_rollback方法让程序回滚到指定的保存点。如果没有问题就使用savepoint_commit方法提交事务。
class AuthorDetailViewSet(viewsets.ModelViewSet):serializer_class AuthorDetailSerializerqueryset AuthorDetail.objects.all()action(methods[post], detailFalse) # detailFalse or True: True: 系统会自动在生成的路由中添加pk值def trans(self, request):serializer self.get_serializer(datarequest.data)if serializer.is_valid(raise_exceptionTrue):valid_data serializer.validated_dataAuthorDetail.objects.create(**valid_data)valid_data_test {gender: male, birthday: 2020-10-01, telephone: 18812341234, addr: 南京市雨花台区}valid_data_test2 {gender: male, birthday: 2020-10-02, telephone: 18812341234, addr: 南京市雨花台区}with transaction.atomic():AuthorDetail.objects.create(**valid_data_test)sid transaction.savepoint()try:res_test2 AuthorDetail.objects.create(**valid_data_test2)res_test2 1except Exception:transaction.savepoint_rollback(sid)print(error and rollback)transaction.savepoint_commit(sid)print(commit success)return Response(statusHTTP_202_ACCEPTED, data{msg: insert success})4. 事务嵌套
事务嵌套只有内外两层的事务都执行成功那么事务才能最终被成功提交。如果内层事务执行失败那么外层的事务也会失败事务最终会提交失败。
class AuthorDetailViewSet(viewsets.ModelViewSet):serializer_class AuthorDetailSerializerqueryset AuthorDetail.objects.all()transaction.atomic # 外层事务的执行成功与否除了它本身外还依赖于内层事务执行成功与否。action(methods[post], detailFalse) # detailFalse or True: True: 系统会自动在生成的路由中添加pk值def trans(self, request):serializer self.get_serializer(datarequest.data)if serializer.is_valid(raise_exceptionTrue):valid_data serializer.validated_dataAuthorDetail.objects.create(**valid_data) # 记录1valid_data_test {gender: male, birthday: 2020-10-01, telephone: 18812341234, addr: 南京市雨花台区}with transaction.atomic(): # 故意让内层的事务执行失败res_test AuthorDetail.objects.create(**valid_data_test) # 记录2res_test 1 return Response(statusHTTP_202_ACCEPTED, data{msg: insert success})最终我们查得数据库的记录1和记录2都没有入库。