Django_事务
介绍
函数说明
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_事务的更多相关文章
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- SQLServer事务同步下如何收缩日志
事务同步是SQLServer做读写分离的一种常用的方式. 随着业务数据的不断增长,数据库积攒了大量的日志,为了腾出硬盘空间,需要对数据库日志进行清理 订阅数据库的日志清理 因为订阅数据库所有的数据都来 ...
- 事务日志已满,原因为“ACTIVE_TRANSACTION”
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 异常处理汇总-数据库系列 http://www.cnblogs.com/dunitia ...
- Mysql事务探索及其在Django中的实践(二)
继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...
- Mysql事务探索及其在Django中的实践(一)
前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...
- CRL快速开发框架系列教程七(使用事务)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 玩转spring boot——结合JPA事务
接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- PHP中PDO事务的使用方法
事务 (Transaction) 是操作数据库中很重要的一个功能, 它可以让你预定一条, 或者一系列 SQL 语句, 然后一起执行. 在执行的过程中, 如果其中的某条执行失败, 可以回滚所有已更改的操 ...
随机推荐
- P1719 最大加权矩形
题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要运动,于是就决定找校长申请一块电脑组的课余运动场地,听说她们都是电脑组的高手,校长没 ...
- Xamarin 编写混合APP趟坑记录(二)
前言 公司要开发一个App,为了便于维护和更新,而不用每次去苹果审核,采用的是混合开发方式:用WebVie+WebApp的方式. 因为本人不会Java和ObjectC,公司又不想花钱招这两个岗位的人, ...
- 第一次作业:基于Linux 4.5的进程模型与调度器分析
1.操作系统是怎么组织进程的? 1.1什么是线程,什么是进程: 刚接触时可能经常会将这两个东西搞混.简单一点的说,进程是一个大工程,线程则是这个大工程中每个小地方需要做的东西(在linux下看作&qu ...
- 检测ip和地区
获取当前位置所在省份城市和所用网络IP <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- python学习之路(1)
今天刚入门python,对于有c和java基础的我,学习起来还是比较容易的,我并没有用PyCharm写,而是最基础的IDLE,学习python比java容易的地方就是不要写分号,不要打包,不要定义等等 ...
- JOOQ快速上手(基于springboot 和 postgresql)
是什么 全称Java Object Oriented Querying,基于java开发出来的工具包,主要用于访问关系型数据库. 为什么用 Hibernate对SQL的操作太抽象 JDBC使用太过繁琐 ...
- SpringMVC拓展——利用maven构建springMVC项目
一.构建项目结构 首先需要构建一个符合目录结构的maven项目 file->new->maven project,勾选 create a simple project->next / ...
- mfc 动态分配内存
动态内存分配new 为数组动态分配内存 为多维数组分配内存 释放内存delete malloc free 动态内存分配new int * pi; pi= new int ; 为 ...
- 22-[模块]-hashlib
1.HASH Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩 ...
- 2555: SubString
2555: SubString 链接 题意: 动态在末尾加入一个字符串,询问一个字符串出现了多少次. 分析: 如果没有动态加入,那么建出SAM后,求出parent树上,每个点|Right|,然后走一遍 ...