django数据库事务

数据库原子操作

举个例子:

一个消费者在一个商户里刷信用卡消费,交易正常时,银行在消费者的账户里减去相应的款项,在商户的帐户加上相应的款项。但是如果银行从消费者的账户里扣完钱之后,还未在商户的帐户里加上相应的款项时,由于某些原因,系统或者数据库出现异常了,那么此时钱已经从消费者的账户里扣除了,但是商户的账户里却没有加上相应的款项,这种情况下,最好的解决办法就是使用数据库的原子性操作,也就是数据库的事务。保证要么同时成功,要么同时失败,然后才向数据库commit。

Django默认向数据库的提交方式

Django的默认行为是在自动提交模式下运行。除非事务处于活动状态,否则每个查询都会立即提交到数据库。

Django自动使用事务或保存点来保证需要多个查询的ORM操作的完整性,尤其是delete()和update()查询。

事务提交后执行任务

有时您需要执行与当前数据库事务相关的操作,但前提是事务成功提交。示例可能包括celery任务,电子邮件通知或缓存失效

Django提供了on_commit()注册回调函数的函数,这些函数应在成功提交事务后执行

from django.db import transaction

def do_something():
    pass  # send a mail, invalidate a cache, fire off a Celery task, etc.

transaction.on_commit(do_something)

  

django如何实现事务

from django.db import transaction

def create(request):
    try:
        with transaction.atomic():
            models.Userinfo.objects.create(username="stu01", email="[email protected]")
            models.Group.objects.create(title="python")

    except Exception as e:
        return HttpResponse("出现错误....")
    return HttpResponse("ok")

  

这样两条sql语句同时插入成功或失败

  

原文地址:https://www.cnblogs.com/hongpeng0209/p/9468912.html

时间: 2024-07-30 14:19:49

django数据库事务的相关文章

Django 数据库事务

管理数据库事务 Django框架提供了好几种方式来控制和管理数据库事务.(以下Django框架会简化为Django,读者可自行脑补框架两字) Django框架默认的事务行为 自动提交作为Django默认的事务行为,它表现形式为:每次数据库操作会立即被提交到数据库中,除非这个事务仍然处于激活状态. 那么,更多详细内容见下文. Django使用事务或者保存点来保证多个ORM操作的完整性,尤其是针对delete()和update()操作. 另外因为某些性能原因,Django提供的TestCase类就将

django订单部分--数据库事务

订单数据库设计 订单号不再采用数据库自增主键,而是由后端生成创建. 终端命令python manage.py startapp orders 创建订单应用orders,编辑模型类models.py from django.db import models from meiduo_mall.utils.models import BaseModel from users.models import User, Address from goods.models import SKU # Creat

django中数据库事务的处理

今天在django中处理数据库数据时,用到事务,官方文档看不下去,网上查资料,那叫一个大海捞针啊,还找不到自己想要的效果. django中的事务, 依据Django1.6的文档,“Django提供了一种简单的API去控制数据库的事务交易...原子操作用来定义数据库事务的属性. 原子操作允许我们在数据库保证的前提下,创建一堆代码.如果这些代码被成功的执行,所对应的改变也会提交到数据库中.如果有异常发生,那么操作就会回滚.”可以采用装饰器用法或代码块用法,强力推荐代码块,如下. from djang

Django 中事务的使用

在 Django 中可以通过django.db.transaction 模块提供的atomic来定义一个事务 atomic提供两种方案实现事务 装饰器用法: from django.db import transaction @transaction.atomic def viewfunc(request): # 这些代码会在一个事务中执行 ...... 装饰器用法:整个视图中所有 MySQL 数据库的操作都看做一个事务,范围太大,不够灵活.而且无法直接作用于类视图 with 语句用法: fro

数据库事务的四大特性和事务隔离级别

Reference: [1] http://www.cnblogs.com/fjdingsd/p/5273008.html [2] http://blog.csdn.net/fg2006/article/details/6937413 数据库事务四大特性 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全

数据库事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景,主要是在多个

数据库-事务和锁

事务 所谓事务是用户定义的一个数据库操作系列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.例如在关系数据库中,一个事务可以是一条sql语句.一组sql语句或整个程序. 给个栗子: 小IT在网上购物,其付款过程至少包括以下几步数据库操作: 更新客户所购商品的库存信息: 生成订单并且保存到数据库: 更新用户相关信息,例如购物数量等: 正常情况下,操作顺利进行,最终交易成功,那么与交易相关的所有数据库信息也成功更新.但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存

数据库事务的四大特性ACID

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,所以事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响.为了实现原子性,需要通过日志:将所有对数据的更新操作都写入日志,如果一个事务中的一部分操作已经成功,但以后的操作,由于断电/系统崩溃/其它的软硬件错误而无法继续,则通过

数据库事务的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复读.幻读这几类问题. √: 可能出现    ×: 不会出现   脏读 不可重复读 幻读 Read uncommitted √ √ √ Read committed × √ √ Repeatable read × × √ Serializable × × × 注意:我们讨论隔离级别的场景,主要是在多个