介绍

函数说明

from django.db import transaction
transaction.atomic  # 原子性操作,把一系列操作当做一个整体,错了则集体回退
transaction.on_commit(func,using = None) # 在整个事件完成后,执行func函数

使用方法


from django.db import transaction
# atomic
@transaction.atomic
def index(request):
... def index(request):
with transation.atomic():
....
.... # on_commit
@transaction.atomic
def index(request):
do_something...
transation.oncommit(func)

示例

from django.db import models

class Account(models.Model):
nid = models.IntegerField(primary_key=True)
money = models.IntegerField(verbose_name="余额")

models.py

from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views urlpatterns = [
re_path("index.html",views.index)
]

urls.py

1、正常情况,转账成功

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db.models import F def index(request):
models.Account.objects.filter(nid=1).update(money=F("money")-1) # 账号1给账号2转账1元钱
# raise IndexError
models.Account.objects.filter(nid=2).update(money=F("money")+1)
return HttpResponse("OK")

views.py

2、转账到一半出现错误

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db.models import F def index(request):
models.Account.objects.filter(nid=1).update(money=F("money")-1)
raise IndexError
models.Account.objects.filter(nid=2).update(money=F("money")+1)
return HttpResponse("OK")

views.py

3、还原所有money到1000,配置事务

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db import transaction
from django.db.models import F def index(request):
with transaction.atomic():
models.Account.objects.filter(nid=1).update(money=F("money")-1)
raise IndexError
models.Account.objects.filter(nid=2).update(money=F("money")+1)
return HttpResponse("OK") # 可以使用装饰器
# @transaction.atomic
# def index(request):
# models.Account.objects.filter(nid=1).update(money=F("money")-1)
# raise ValueError("出错")
# models.Account.objects.filter(nid=2).update(money=F("money")+1)
# return HttpResponse("OK")

views.py

4、验证on_commit

说明:如果原子性操作出错,则整个on_commit都不会执行,无论on_commit放在什么位置。这与直接在该位置执行func是不一样的。

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db import transaction
from django.db.models import F def before():
print("before")
# 可以做一些特定工作,如发邮件、记录log def after():
print("after") @transaction.atomic
def index(request):
transaction.on_commit(before)
models.Account.objects.filter(nid=1).update(money=F("money")-1)
# raise ValueError("出错")
models.Account.objects.filter(nid=2).update(money=F("money")+1)
transaction.on_commit(after)
return HttpResponse("OK")

views.py

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db import transaction
from django.db.models import F def before():
print("before")
# 可以做一些特定工作,如发邮件、记录log def after():
print("after") @transaction.atomic
def index(request):
transaction.on_commit(before)
models.Account.objects.filter(nid=1).update(money=F("money")-1)
raise ValueError("出错")
models.Account.objects.filter(nid=2).update(money=F("money")+1)
transaction.on_commit(after)
return HttpResponse("OK")

触发错误,raise ValueError,未出现func的东西

Django_事务的更多相关文章

  1. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  2. SQLServer事务同步下如何收缩日志

    事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...

  3. 事务日志已满,原因为“ACTIVE_TRANSACTION”

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列  http://www.cnblogs.com/dunitia ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. PHP中PDO事务的使用方法

    事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...

随机推荐

  1. JS 兼容大全

    //获取浏览器可视区宽度 function getWidth() { if (window.innerWidth){ return window.innerWidth; } else{ if (doc ...

  2. spring boot集成dubbo

    spring-boot-start-dubbo spring-boot-start-dubbo,让你可以使用spring-boot的方式开发dubbo程序.使dubbo开发变得如此简单. 如何使用 1 ...

  3. 1.1《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——运行终端

    终端是个允许我们运行命令行的程序,运行命令前,先打开它.在MacOS系统上,可以使用macOS应用 Spotlight来打开终端窗口,Spotlight也有其他两种方式触发,一种是键入⌘␣(comma ...

  4. block本质探寻三之block类型

    一.oc代码 提示:看本文章之前,最好按顺序来看: //代码 void test1() { ; void(^block1)(void) = ^{ NSLog(@"block1----&quo ...

  5. POJ 1151 Atlantis 矩形面积求交/线段树扫描线

    Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...

  6. 关于VC++6.0与WIN10系统不兼容的解决办法

    记得第一次接触C语言,用的第一个编译器就是VC++6.0.当时自己的是Win10系统,第一次安装就打不开,后来网上一查说是系统兼容性的问题.今天室友突然想安装VC++6.0,也遇到了兼容的问题,我就帮 ...

  7. 时间序列分析工具箱——tidyquant

    目录 时间序列分析工具箱--tidyquant tidyquant 的用途 加载包 tq_get:获得数据 从 Yahoo! Finance 获得股票数据 从 FRED 获得经济数据 使用 tq_tr ...

  8. Autovacuum 的运行限制

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 作者:高健@博客园  luckyjackgao ...

  9. 4-[多进程]-互斥锁、Queue队列、生产者消费者

    1.互斥锁 (1)为什么需要互斥锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如下 #并发运行,效率 ...

  10. metasploit-端口扫描

    大体可以分为两种方式: 1.调用nmap进行端口扫描 msfconsole nmap -v -sV www.cstc.org.cn 扫描结果(端口开放情况以及目标服务操作系统相关操作信息) PORT ...