Django transaction.atomic 事务的使用
函数 transaction.atomic
数据库的读写操作中,事务在保证数据的安全性和一致性方面起着关键的作用,而回滚正是这里面的核心操作。
遇到并发的时候常常会因为接口的访问顺序或者其他情况,导致数据的不一致,这时候就知道回滚的重要性了,下面有个简单的小例子 可以实现数据库事务的操作
Demo
数据库的模型和返回值窝这边就不贴出来了
这是一个接口
from django.db import transaction
import time
def keke_test(request):
code = 1
msg = '操作成功'
g = request.REQUEST.post
params = dict()
model_id = g.get('id', '0')
model = None
if model_id > 0:
model = IosSdkVersions.objects.filter(id=model_id).first()
with transaction.atomic(): # 禁止自动提交,保证该函数中的所有数据库操作在同一个事物中,第一个数据库操作1即使成功保存到数据库中,只要第2个数据操作失败,那么所有该段代码所有设计的都会更改回滚到原来
try:
sdk_flag_model = IosSdkTest.objects.filter(id=1).first()
sid = transaction.savepoint() # 开启事务设置事务保存点
sdk_flag_model.sdk_flag = 8
sdk_flag_model.save() # 完成就保存,但不是马上提交
time.sleep(10)
all_issue_field_value = IosSdkVersions.objects.filter(id=3)
for issue in all_issue_field_value:
issue.test_id = 8
issue.save()
# 1 / 0
except Exception as e:
print(e)
transaction.savepoint_rollback(sid) # 失败回滚事务(如果数据库操作发生异常,回滚到设置的事务保存点)
print('数据保存失败')
code = -1001
else:
code = 1
transaction.savepoint_commit(sid) # 如果没有异常,成功提交事物
params['code'] = code
return json_response(params)
# 接口2,当执行第一个接口的时候,因为sleep的存在,这个操作会一直等待到第一个接口完成操作 再进行操作
def keke_test2(request):
code = 1
msg = '操作成功'
_g = request.REQUEST.get
sdk_flag_model = IosSdkTest.objects.filter(id=1).first()
sdk_flag_model.sdk_flag = 2
sdk_flag_model.save() # 因为被锁住了所以接口会等到上一个接口的完成
# if sdk_flag_model.sdk_flag == 8:
# all_issue_field_value = IosSdkVersions.objects.filter(id=3)
# for issue in all_issue_field_value:
# issue.test_id -= 2
# issue.save()
params = dict()
return json_response(params)
# 接口2 other
def keke_test2(request):
code = 1
msg = '操作成功'
_g = request.REQUEST.get
sdk_flag_model = IosSdkTest.objects.filter(id=1).first()
if not sdk_flag_model.sdk_flag == 2: # 会等到flag为2的时候才去执行下面的操作
sdk_flag_model.sdk_flag = 3
sdk_flag_model.save()
params = dict()
params['code'] = code
return json_response(params)
# other
def keke_test2(request):
code = 1
msg = '操作成功'
_g = request.REQUEST.get
with transaction.atomic(): # 禁止自动提交,保证该函数中的所有数据库操作在同一个事物中,第一个数据库操作1即使成功保存到数据库中,只要第2个数据操作失败,那么所有该段代码所有设计的都会更改回滚到原来
sid = transaction.savepoint() # 开启事务设置事务保存点
try:
sdk_flag_model = IosSdkTest.objects.select_for_update().get(id=1) # 互扯锁的另一种实现
sdk_flag_model.sdk_flag = 8
sdk_flag_model.save()
time.sleep(10)
except Exception as e:
print(e)
transaction.savepoint_rollback(sid) # 失败回滚事务(如果数据库操作发生异常,回滚到设置的事务保存点)
print('数据保存失败')
code = -1001
else:
code = 1
transaction.savepoint_commit(sid) # 如果没有异常,成功提交事物
params = dict()
params['code'] = code
return json_response(params)
悲观锁
# 悲观锁实现, 都要放在 with transaction.atomic() 事务中 同条数据上锁完,需要等释放后才能再次上锁的吧
def keke_test2(request):
code = 1
msg = '操作成功'
_g = request.REQUEST.get
with transaction.atomic(): # 禁止自动提交,保证该函数中的所有数据库操作在同一个事物中,第一个数据库操作1即使成功保存到数据库中,只要第2个数据操作失败,那么所有该段代码所有设计的都会更改回滚到原来
sid = transaction.savepoint() # 开启事务设置事务保存点
try:
sdk_flag_model = IosSdkTest.objects.select_for_update().get(id=1) # 互扯锁的另一种实现
sdk_flag_model.sdk_flag = 8
sdk_flag_model.save()
time.sleep(10)
except Exception as e:
print(e)
transaction.savepoint_rollback(sid) # 失败回滚事务(如果数据库操作发生异常,回滚到设置的事务保存点)
print('数据保存失败')
code = -1001
else:
code = 1
transaction.savepoint_commit(sid) # 如果没有异常,成功提交事物
params = dict()
params['code'] = code
return json_response(params)
def keke_test3(request):
code = 1
msg = '操作成功'
_g = request.REQUEST.get
with transaction.atomic():
sdk_flag_model = IosSdkTest.objects.select_for_update().get(id=1)
print(sdk_flag_model.sdk_flag)
params = dict()
params['code'] = code
return json_response(params)
原生sql 锁的操作
参考:https://segon.cn/mysql-for-update.html
Django transaction.atomic 事务的使用的更多相关文章
- Python Django,事务,transaction.atomic,事务保存点
from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic imp ...
- Django中的事务(Transaction)管理
Django默认的事务行为 默认情况下,在Django中事务是自动提交的.当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交 ...
- Django中关于事务的代码编写
Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用 ...
- Django transaction 误用之后遇到的一个问题与解决方法
今天在调试项目开发好的一个模块的时候,发现了一个很诡异的现象,最后追踪发现是因为在项目中事务处理有误所致.这个问题坑了我好一会,所以记录一下,以免再踩坑.下面开始详述. 我们都知道 Django 框架 ...
- django中使用事务以及接入支付宝支付功能
之前一直想记录一下在项目中使用到的事务以及支付宝支付功能,自己一直犯懒没有完,趁今天有点兴致,在这记录一下. 商城项目必备的就是支付订单的功能,所以就会涉及到订单的保存以及支付接口的引入.先来看看订单 ...
- DJango中开启事务的两种方式
目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...
- 事务的隔离级别,mysql中开启事务、django中开启事务
目录 一.事务的特性 二.数据库中开启事务 三.Django中开启事务的两种方式 第一种 第二种 四.事务的隔离级别 隔离级别 如何查看mysql隔离级别? 修改事务的隔离级别 隔离级别解释 read ...
- Django中MySQL事务的使用
Django中事物的使用 from django.db import transaction @transaction.atomic通过transaction的@transaction.atomic装 ...
- Django中的事务与ajax
一 事务与锁 1.行级锁 行级锁是由存储引擎实现的.如mysql里默认指定的InnoDB存储引擎,由它实现行级锁.InnoDB的行级锁定同样分为两种类型,共享锁(X)和排他锁(S). 对于UPDATE ...
- day54:django:锁和事务&Ajax&中间件Middleware
目录 1.ORM中的锁和事务 2.Ajax 3.中间件:Middleware 3.1 什么是中间件? 3.2 django请求的生命周期 3.3 中间件可以定义的5个方法 3.4 自定义中间件的流程 ...
随机推荐
- Ubantu12.04安装及离线安装网卡驱动
一.用软通牒UltarISO写入硬盘映像,制作启动U盘 装机,ubantu安装很简单. 二.安装网卡驱动 1. 下载e1000e:https://downloadcenter.intel.com/De ...
- 2022.07.25 TypeScript基础类型介绍
基础类型: 字符串(string)(String) let first: string = 'niu' // 直接赋值 let fourth: string = `niu` // 模板字符串 let ...
- webservice学习随笔(一):简单的webservice实例
一.webService概念简单介绍: 简单来说,webservice就是远程调用技术,也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的 ...
- unidbgrid导出Excel到多个sheet
xls := TXlsFile.Create(true); xls.NewFile; xls.ActiveSheet := 1; xls.SheetName := '未自评人员清单'; xls.Act ...
- uglifyjs-webpack-plugin配置
项目使用vuecli3搭建,在vue.config.js文件中进行配置,主要配置了去除线上环境的打印信息. 首先安装插件, 执行命令 npm install uglifyjs-webpack-plug ...
- luac编译命令
luac -o out.lua 1.lua 可以不要后缀 luac -o out 1.lua
- ZOJ 3735 Josephina and RPG (概率dp)
题意:给你一个n,然后给你C(n,3)个队伍, 给你每个队伍之间的胜率. 接下来给你m个队伍,让你依次跟他们比赛,开始你能选择任意的队伍,如果你打赢了一支队伍,你可以选择换成输给你的这个队伍或者不换, ...
- 保姆级本地maven安装配置步骤【Windows】
一.前期准备 1.首先需要安装并配置好本地JDK(WIN+R输入cmd,输入java -version如下图) 2.下载maven到本地(链接Maven – Download Apache Maven ...
- Asp-Net-Core开发笔记:使用RateLimit中间件实现接口限流
前言 最近一直在忙(2月份沉迷steam,3月开始工作各种忙),好久没更新博客了,不过也积累了一些,忙里偷闲记录一下. 这个需求是这样的,我之前做了个工单系统,现在要对登录.注册.发起工单这些功能做限 ...
- java多线程--6 死锁问题 锁Lock
java多线程--6 死锁问题 锁Lock 死锁问题 多个线程互相抱着对方需要的资源,然后形成僵持 死锁状态 package com.ssl.demo05; public class DeadLock ...