函数 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 事务的使用的更多相关文章

  1. Python Django,事务,transaction.atomic,事务保存点

    from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic imp ...

  2. Django中的事务(Transaction)管理

    Django默认的事务行为 默认情况下,在Django中事务是自动提交的.当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交 ...

  3. Django中关于事务的代码编写

    Django中对于数据库的事务,默认每执行一句数据库操作,便会自动提交. 在Django中可以通过django.db.transaction模块提供的atomic来定义一个事务,atomic提供两种用 ...

  4. Django transaction 误用之后遇到的一个问题与解决方法

    今天在调试项目开发好的一个模块的时候,发现了一个很诡异的现象,最后追踪发现是因为在项目中事务处理有误所致.这个问题坑了我好一会,所以记录一下,以免再踩坑.下面开始详述. 我们都知道 Django 框架 ...

  5. django中使用事务以及接入支付宝支付功能

    之前一直想记录一下在项目中使用到的事务以及支付宝支付功能,自己一直犯懒没有完,趁今天有点兴致,在这记录一下. 商城项目必备的就是支付订单的功能,所以就会涉及到订单的保存以及支付接口的引入.先来看看订单 ...

  6. DJango中开启事务的两种方式

    目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...

  7. 事务的隔离级别,mysql中开启事务、django中开启事务

    目录 一.事务的特性 二.数据库中开启事务 三.Django中开启事务的两种方式 第一种 第二种 四.事务的隔离级别 隔离级别 如何查看mysql隔离级别? 修改事务的隔离级别 隔离级别解释 read ...

  8. Django中MySQL事务的使用

    Django中事物的使用 from django.db import transaction @transaction.atomic通过transaction的@transaction.atomic装 ...

  9. Django中的事务与ajax

    一 事务与锁 1.行级锁 行级锁是由存储引擎实现的.如mysql里默认指定的InnoDB存储引擎,由它实现行级锁.InnoDB的行级锁定同样分为两种类型,共享锁(X)和排他锁(S). 对于UPDATE ...

  10. day54:django:锁和事务&Ajax&中间件Middleware

    目录 1.ORM中的锁和事务 2.Ajax 3.中间件:Middleware 3.1 什么是中间件? 3.2 django请求的生命周期 3.3 中间件可以定义的5个方法 3.4 自定义中间件的流程 ...

随机推荐

  1. django+ajax实现xlsx文件下载功能

    前端代码 $("#id_pullout").click(function () { //发送ajax请求 $.ajax({ url: '/pullout/', //请求的url m ...

  2. 浅谈js防抖和节流

    防抖和节流是处理高频触发最常见的优化方式,对性能提升有很大的帮助. 防抖:将多次的高频操作优化为只在最后一次执行,应用场景如:输入框,只需在最后一次输入进行校验即可. 节流:保证每隔一段时间只执行一次 ...

  3. [WinUI 3] 如何利用D3D11在SwapChainPanel控件上绘制OpenGL(Uwp通用)

    预览 技术实现 看过我上篇在 WPF 中实现 OpenGL 与 D3D 渲染的同学应该知道,我是依靠 WGL 中 WGL_NV_DX_interop 扩展与 D3D Surface 关联并在使用该 S ...

  4. ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  5. Out Of Memory 案例

    案例一:老年代内存泄漏 某晚八点收到报警邮件,一看是OOM: ​ 打开 hickwall查看指标:JVM各项指标中 老年代在持续增长(从上次发布10月30号到11月10号的 12天 一直在增长,存在内 ...

  6. Netty 心跳检测与重连机制

    更多内容,前往个人博客 所谓心跳,即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包,通知对方自己还在线,以确保 TCP 连接的有效性.心跳包还有另一个作用,经常被忽略,即:一个连 ...

  7. AlphaFold2中的残基刚体表示

    技术背景 在前面的这一篇博客中,比较全面的介绍了组成蛋白质的各种氨基酸的三维结构.由于每个氨基酸大小不一,在传统的蛋白质折叠预测的方案中,一般会考虑全原子方案或者是粗粒化方案.对于全原子方案而言,即时 ...

  8. Linux报错:audit: backlog limit exceeded(审计:超出积压限制)

    Linux报错:audit: backlog limit exceeded(审计:超出积压限制) 系统版本:CentOS Linux release 7.6.1810 (Core) 问题现象:一次巡检 ...

  9. mongodb安装及操作

    1.回顾 node服务器的写法 服务器 前后端分离 前后端不分离 express express生成器 ejs模版语法:变量.条件判断.循环渲染.引入 2.mongodb介绍 MongoDB 是一个基 ...

  10. [ACM]TL-Prim

    #include<iostream> #include<cstdio> using namespace std; int main(){ int inf = 99999999; ...