怎么在Django中使用transaction管理事务
本篇文章给大家分享的是有关怎么在Django中使用transaction管理事务,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
1. transaction事务内不执行数据库的commit操作
除非手动commit
transaction最基本的功能。
代码场景:
在事务当前启动celery异步任务, 无法获取未提交的改动。
def example_view(request): with transaction.atomic(): change_obj() # 修改对象变量 obj.save() async_task.delay(obj.id)def async_task(obj_id): obj = Model.objects.get(pk=obj_id) read_the_obj() # 读取对象信息
在使用transaction当中, Model.save()都不做commit,因此如果在transaction当中设置异步任务,使用get()查询数据库,将看不到对象在事务当中的改变.这也是实现”可重复读”的事务隔离级别,即同一个事务里面的多次查询都应该保持结果不变。
2.transaction只对数据库层的操作进行事务管理
不能理解为python操作的事务管理
代码如下:
def example_view(request): tag = False with transaction.atomic(): tag = True change_obj() # 修改对象变量 obj.save() raise DataError print("tag = ",tag)
tag = True #输出内容
即使事务代码块发生了DataError,事务回滚,也仅是数据库层面的回滚,针对python的操作依然已完成。
甚至是对Model.Object进行的操作会也会存在变量当中。
如:
def example_view(request): obj.changed = False with transaction.atomic(): obj.changed = True change_obj() # 修改对象其他变量 obj.save() raise DataError print("obj.changed = ",obj.changed)
obj.changed = True #输出内容
发生Dataerror异常的回滚仅在数据库层面操作,因此不可以根据model object的属性值判断是否正确完成了事务。
另外,虽然Django对数据库层面以ORM完成了很具体的抽象,但应该要清楚地意识到我们操作的model object和数据库内容本质不同,DJANGO只在查询和提交时进行数据库操作。
补充:Django 事务transaction.atomic()的使用方法
看代码吧~
from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic import Viewfrom django.db import transaction # 导入事务 # 类视图 (事务,@transaction.atomic装饰器)class MyView(View): @transaction.atomic # transaction.atomic装饰器可以保证该函数中所有的数据库操作都在一个事务中。 def post(self, request): # 数据库操作1。。。 # 数据库操作2。。。 return HttpResponse('ok') # 类视图 (事务,保存点的使用)class MyView2(View): @transaction.atomic def post(self, request): # 设置事务保存点 s1 = transaction.savepoint() # 可以设置多个保存点 # 数据库操作。。。 # 事务回滚 (如果发生异常,就回滚事务) transaction.savepoint_rollback(s1) # 可以回滚到指定的保存点 # 提交事务 (如果没有异常,就提交事务) transaction.savepoint_commit(s1) # 返回应答 return HttpResponse('ok')
以上就是怎么在Django中使用transaction管理事务,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341