解决Django transaction进行事务管理踩过的坑


Posted in Python onApril 24, 2021

概要

Transaction是django进行数据库原子性操作在python层面上的实现。

简单来说, 被transaction.atomic()包裹的代码块只在代码块顺利完成后进行数据库层面的commit。实际开发当中,遇到了一些问题。

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 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')

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
python通过post提交数据的方法
May 06 Python
举例详解Python中循环语句的嵌套使用
May 14 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
Python基础中所出现的异常报错总结
Nov 19 Python
python 设置文件编码格式的实现方法
Dec 21 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
Python实现的简单排列组合算法示例
Jul 04 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
windows下numpy下载与安装图文教程
Apr 02 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Python短信轰炸的代码
Mar 25 Python
Python实现自动装机功能案例分析
Oct 22 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 #Python
Python使用UDP实现720p视频传输的操作
python通配符之glob模块的使用详解
Apr 24 #Python
Django debug为True时,css加载失败的解决方案
Apr 24 #Python
python 模块重载的五种方法
Apr 24 #Python
写一个Python脚本自动爬取Bilibili小视频
python实现图片批量压缩
Apr 24 #Python
You might like
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
JS 类型转换常见方法小结
2010/05/31 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
js中的如何定位固定层的位置
2014/06/15 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
vue微信分享插件使用方法详解
2020/02/18 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
JavaScript 中判断变量是否为数字的示例代码
2020/10/22 Javascript
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
如何通过雪花算法用Python实现一个简单的发号器
2019/07/03 Python
python实现超市商品销售管理系统
2019/10/25 Python
Python web如何在IIS发布应用过程解析
2020/05/27 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
详解向scrapy中的spider传递参数的几种方法(2种)
2020/09/28 Python
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
护士自荐信
2013/10/25 职场文书
国家励志奖学金获奖感言
2014/01/09 职场文书
初二生物教学反思
2014/02/03 职场文书
网站美工岗位职责
2014/04/02 职场文书
质量月口号
2014/06/20 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
2014年小学德育工作总结
2014/12/05 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
婚宴父母致辞
2015/07/27 职场文书