Django中的事务介绍

简介: Django中的事务介绍

一、Django事务介绍

在Django中,它的 默事务行为是自动提交。除非事务正在执行,每个查询将会马上自动提交到数据库, 例如:

# ApiData为model
ApiData.objects.create(name='测试名字', path='/')
ApiData.objects.filter(id=1).update(name='测试名字', path='/')

如果没有手动设置事务,那么这两条代码在执行完成后就会马上提交到数据库中进行保存,Django 自动使用事务或还原点,以确保需多次查询的 ORM 操作的一致性,特别是 delete() 和 update() 操作。

二、使用Django事务

通过django手动创建事务的方式一般为两种:装饰器和with:

装饰器:

@api_view(['POST'])
@transaction.atomic
def test_views(request):
    """
    该方法会在一个事务中执行
    """
    ApiData.objects.create(name='测试名字', path='/')
    ApiData.objects.filter(id=1).update(name='测试名字', path='/')
    return Response(data={'msg': '创建成功!'})

with语句:

@api_view(['POST'])
def test_views(request):
    try:
        with transaction.atomic(): #仅with包裹的下面的语句会在事务中执行
            ApiData.objects.create(name='测试名字', path='/')
            ApiData.objects.filter(id=1).update(name='测试名字', path='/')
    except Exception as e:
        pass
    return Response(data={'msg': '创建成功!'})

需要注意的是当事务回滚时,模型的属性需要手动恢复。

例如下面的代码,obj.active的初始值是False.我们设置了obj.active=True然后进行了保存obj.save()操作,但这个时候发生了异常导致保存失败了,那此时的obj.active的值还是为True,并不会因为保存失败而变为False

from django.db import DatabaseError, transaction
obj = MyModel(active=False)
obj.active = True
try:
    with transaction.atomic():
        obj.save()
except DatabaseError:
    pass
if obj.active: #下面的代码
    ...

因此,针对上面的代码我们可以在抛异常处将active的值设为False来达到恢复模型属性的值的目的:

try:
    with transaction.atomic():
        obj.save()
except DatabaseError:
    obj.active=False #手动恢复active属性

三、全局事务

如果为了图省事而场景也较为通用,我们可以设置全局事务配置来让每个请求view都使用事务:

settings.py配置文件中的DATABASES项里增加ATOMIC_REQUESTS配置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'testdb', 
        'USER': 'root',  
        'PASSWORD': '123', 
        'HOST': '127.0.0.1',     
        'PORT': 3306,  
        'ATOMIC_REQUESTS': True  # 全局开启事务,和http请求的整个过程绑定在一起
    }
}

这样就将每个视图包裹在这个数据库的事务中了,只有视图未完成执行成功,都将回滚到请求前的初始状态。


另外也可以增加AUTOCOMMIT=False的配置项来禁用Django的事务管理以此来使用自定义的事务。

目录
相关文章
|
Web App开发 存储 缓存
第20天,Cookie与Session、Django的用户认证、事务
目录 一、Cookie与Session 1.1 概念 1.2 Django实现的cookie 1.2.1 获取Cookie 1.
2277 0
|
数据库 Python 关系型数据库
Django的ORM实现数据库事务操作
在Django中实现数据库的事务操作 在学习MySQL数据库时,MySQL数据库是支持原子操作的. 什么是数据库的原子操作呢??打个比方,一个消费者在一个商户里刷信用卡消费. 交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项.
1055 0
|
5天前
|
监控 安全 应用服务中间件
python中Django入门(四)
python中Django入门(四)
31 0
|
5天前
|
安全 数据库 C++
Python Web框架比较:Django vs Flask vs Pyramid
【4月更文挑战第9天】本文对比了Python三大Web框架Django、Flask和Pyramid。Django功能全面,适合快速开发,但学习曲线较陡;Flask轻量灵活,易于入门,但默认配置简单,需自行添加功能;Pyramid兼顾灵活性和可扩展性,适合不同规模项目,但社区及资源相对较少。选择框架应考虑项目需求和开发者偏好。
|
5天前
|
前端开发 UED Python
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
Wagtail-基于Python Django的内容管理系统CMS实现公网访问
|
5天前
|
中间件 Python
中间件应用Django Middleware(Python)
【5月更文挑战第3天】中间件应用Django Middleware(Python)
38 6
中间件应用Django Middleware(Python)
|
5天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
26 3
|
5天前
|
存储 搜索推荐 开发者
django-haystack,具有全文搜索功能的 Python 库!
django-haystack,具有全文搜索功能的 Python 库!
29 0
|
5天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
20 0