介绍

函数说明

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. JavaScript 空位补零实现代码

    实现一: 复制代码代码如下: /* 平淡无奇法 */ function pad(num, n) { var i = (num + "").length; while(i++ < ...

  2. ddt 接口示范以及报告生成html案例

    1.数据构造获取我就不写了直接以test_data=[  ] 构造一个简单数据建模.实际你从哪里获取根据情况excel也好yaml也罢 2.用例套件处理,报告生成处理 import ddtimport ...

  3. zabbix 监控机器监听的端口 + 触发器 表达式理解

    在zabbix web 页面配置item,监控监听的21端口 配置trigger 参考:http://www.cnblogs.com/saneri/p/6126786.html 5. {www.zab ...

  4. zabbix 主动模式和被动模式配置文件对比

    1.主动模式: 在web上看zabbix available 是红色 [root@python ~]# egrep -v '^#|^$' /etc/zabbix/zabbix_agentd.conf ...

  5. MapReduce操作Hbase --table2file

    官方手册:http://hbase.apache.org/book.html#mapreduce.example 简单的操作,将hbase表中的数据写入到文件中. RunJob 源码: import ...

  6. Scala的文件读写操作与正则表达式

    目录 在本篇博客中你将会学习并了解常用的文件处理任务,例如读取文件的一行文本,本博客的要点包含: Source.fromFile(...).getLines.toArray 输出文件所有行 Sourc ...

  7. Velocity学习3

    Velocity快速入门教程 Apache的速度是一个基于Java的的模板引擎(模板引擎),它允许任何人仅仅简单的使用模板语言(模板语言)来引用由java的代码定义的对象. 官网介绍如下: Veloc ...

  8. 洛咕P3250 [HNOI2016]网络 整体二分

    这题太神仙了必须写博客... 显然可以想到二分答案.二分一个答案mid,如果所有长度\(\geq mid\)的路径都过x,那么答案一定\(<mid\),否则答案\(\geq mid\). 那么就 ...

  9. 总结一下公司项目使用各种较新的前端技术和 Api 的一些经验。

    关于 ES6: 需要注意 ES6 的一些特性和 API 是需要一个 200k 的 Polyfill 才能得到支持的,特性如 for ... of 循环,generator,API 如 Object.a ...

  10. asp.net core 发布到docker 极简步骤

    1.使用dotnet命令发布项目 2.把发布成功的文件通过scp等工具发布到linux服务器上,在当前目录下新建一个dockerfile 3.使用asp.net core镜像为底包构建一个新的镜像 4 ...