Transaction事务管理过程中会有哪些问题,怎样解决
Admin 2022-07-04 群英技术资讯 543 次浏览
Transaction是django进行数据库原子性操作在python层面上的实现。
简单来说, 被transaction.atomic()包裹的代码块只在代码块顺利完成后进行数据库层面的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()查询数据库,将看不到对象在事务当中的改变.这也是实现”可重复读”的事务隔离级别,即同一个事务里面的多次查询都应该保持结果不变。
不能理解为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 render from django.http import HttpResponse from django.views.generic import View from 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')
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了一文了解Python 流程控制,Python 中有while和for两种循环机制,其中while循环是条件循环,文章通过展开循环内容展开控制流程详情,需要的小伙伴可以参考一下
这篇文章介绍了Django框架中表单的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
从ZoomEye到BugScan,再到TangScan,大型的Poc/EXP平台越来越多,各种扫描器也层出不穷。Web安全的门槛越来越高,自动化的渗透已经成了一种趋势。我一直梦想着,将来渗透的时候,先打开自己写的各种自动化工具,输入目标,然后喝着咖啡,刷着知乎,最后只需要把工具的分析报告整理整理就可以了。事实上,现在的扫描器也正在向这个方向发展,期待一键getshell的那一天。
在python中如果要将一个文件完全加载到内存中,通过file.readlines()即可,但是在文件占用较高时,我们是无法完整的将文件加载到内存中的,这时候就需要用到python的file.readline()进行迭代式的逐行读取:
今天给大伙分享一下 Python 爬虫的教程,这次主要涉及到的是关于某 APP 的逆向分析并抓取数据,关于 APP 的反爬会麻烦一些,比如 Android 端的代码写完一般会进行打包并混淆加密加固,所以除了抓包之外,还需要对 APP 进行查壳脱壳反编译等操作。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008