当前位置: 首页 > news >正文

django实现悲观锁乐观锁

前期准备

# 线上卖图书-图书表  图书名字,图书价格,库存字段-订单表: 订单id,订单名字# 表准备class Book(models.Model):name = models.CharField(max_length=32)price = models.IntegerField()  #count = models.SmallIntegerField(verbose_name='库存')class Order(models.Model):order_id = models.CharField(max_length=64)order_name = models.CharField(max_length=32)# 使用mysql
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'lqz','HOST': '127.0.0.1','PORT': '3306','USER': 'lqz','PASSWORD': '123',}
}# 创建lqz数据库

1.原生mysql悲观锁

begin; # 开启事务select * from goods where id = 1 for update;  # 行锁# order表中加数据update goods set stock = stock - 1 where id = 1; # 更新commit; #提交事务

2.orm实现上述(悲观锁) 

#1  使用悲观锁实现下单
@transaction.atomic  # 整个过程在一个事物中---》改两个表:book表减库存,订单表生成记录
def seckill(request):# 锁住查询到的book对象,直到事务结束sid = transaction.savepoint() # 保存点# 悲观锁: select_for_update()# 加锁了--》行锁还是表锁? 分情况,都有可能#book = Book.objects.select_for_update().filter(pk=1).first()  # 加悲观锁,行锁,锁住当前行if book.count > 0:print('库存可以,下单')# 订单表插入一条Order.objects.create(order_id=str(datetime.datetime.now()), order_name='测试订单')# 库存-1,扣减的时候,判断库存是不是上面查出来的库存,如果不是,就回滚time.sleep(random.randint(1, 4))  # 模拟延迟book.count=book.count-1book.save()transaction.savepoint_commit(sid)  # 提交,释放行锁return HttpResponse('秒杀成功')else:transaction.savepoint_rollback(sid) #回滚,释放行锁return HttpResponse('库存不足,秒杀失败')

3 乐观锁秒杀--》库存还有,有的人就没成功

# 2 乐观锁秒杀--普通版
@transaction.atomic
def seckill(request):# 锁住查询到的book对象,直到事务结束sid = transaction.savepoint()book = Book.objects.filter(pk=1).first()  # 没加锁count = book.countprint('现在的库存为:%s' % count)if book.count > 0:print('库存可以,下单')Order.objects.create(order_id=str(datetime.datetime.now()), order_name='测试订单-乐观锁')# 库存-1,扣减的时候,判断库存是不是上面查出来的库存,如果不是,就回滚# time.sleep(random.randint(1, 4))  # 模拟延迟res = Book.objects.filter(pk=1, count=count).update(count=count - 1)if res >= 1:  # 表示修改成功transaction.savepoint_commit(sid)return HttpResponse('秒杀成功')else:  # 修改不成功,回滚transaction.savepoint_rollback(sid)return HttpResponse('被别人改了,回滚,秒杀失败')else:transaction.savepoint_rollback(sid)return HttpResponse('库存不足,秒杀失败')

 

相关文章:

django实现悲观锁乐观锁

前期准备 # 线上卖图书-图书表 图书名字,图书价格,库存字段-订单表: 订单id,订单名字# 表准备class Book(models.Model):name models.CharField(max_length32)price models.IntegerField() #count models.SmallIntegerField…...

vector【2】模拟实现(超详解哦)

vector 引言(实现概述)接口实现详解默认成员函数构造函数析构函数赋值重载 迭代器容量size与capacityreserveresizeempty 元素访问数据修改inserterasepush_back与pop_backswap 模拟实现源码概览总结 引言(实现概述) 在前面&…...

金融助贷公司怎么获客——大数据获客

2023年已过去大半,整个贷款领域遭遇的现象仍然是拓客难、拓客贵、顾客精确度不高难题。从业者工作压力与日俱增,每日遭遇各种各样考评,因此大家并不是在开发客户便是在开发客户的路上。贷款市场销售艰难变成一个问题,很多贷款营销…...

Java进阶-Oracle(二十一)(2)

🌻🌻 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型:1.1.2 字符串类型:1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…...

SpringCloud实用篇4——MQ RabbitMQ SpringAMQP

目录 1 初识MQ1.1 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.2 技术对比 2.快速入门2.1 安装RabbitMQ2.1.1 单机部署2.1.2集群部署 2.2 RabbitMQ消息模型2.3.导入Demo工程2.4 入门案例2.4.1 publisher实现2.4.2 consumer实现 3 SpringAMQP3.1 Basic Queue 简单队列模型3.1…...

【BASH】回顾与知识点梳理(二十二)

【BASH】回顾与知识点梳理 二十二 二十二. Linux 账号管理22.1 Linux 的账号与群组使用者标识符: UID 与 GID使用者账号/etc/passwd 文件结构/etc/shadow 文件结构 关于群组: 有效与初始群组、groups, newgrp/etc/group 文件结构有效群组(effective grou…...

shell脚本之正则表达式

目录 一.常见的管道命令1.1sort命令1.2uniq命令1.3tr命令1.4cut命令1.5实例1.5.1统计当前主机连接状态1.5.2统计当前主机数 二.正则表达式2.1正则表达式的定义2.2常见元字符(支持的工具:find,grep,egrep,sed和awk&…...

将SM2根证书预置到chromium中

最近花了很多精力在做chromium的GmSSL适配,协议和算法都已经完成,这篇文章是关于将SM2根证书预置到chromium中 我的开发测试环境是macos12.4,从chromium的代码和文档中得知证书获取和校验都是通过操作系统以及native api接口完成&#xff0c…...

linux安装mysql-8.0.33正确方式及常见问题

目录 获取mysql下载地址链接 解压安装包 复制文件到安装目录 添加用户和用户属组修改权限 创建存储数据的文件夹/usr/local/mysql 初始化安装 修改配置文件 创建日志文件并赋予对应权限 启动成功​编辑 创建软链接 之前安装过mysql,时间比较长忘记安装步骤了今天…...

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件,但是需要手动安装比较麻烦,Vim本身没有提供插件管理器,所以会有很多的第三方的插件管理器,有一个vim的插件叫做 “vim-easymotion”,在它的github的安装说明里有列出对于不同…...

机器学习丨1. 机器学习概述

Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…...

清除pip安装库时的缓存

目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时,如果之前已经下载过该库,pip会默认使用缓存来安装库,而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中,具体位置因操作系统和Python版本而异…...

gitee上传一个本地项目到一个空仓库

gitee上传一个本地项目到一个空仓库 引入 比如,你现在本地下载了一个半成品的框架,现在想要把这个本地项目放到gitee的仓库上,这时就需要我们来做到把这个本地项目上传到gitee上了。 具体步骤 1. 登录码云 地址:https://gite…...

力扣:63. 不同路径 II(Python3)

题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从…...

【C语言】每日一题(多数元素)

多数元素,链接奉上 方法 1.摩尔投票2.合理但错误的方法2.1暴力循环2.2排序求出中间元素中间元素 1.摩尔投票 先来简单的介绍摩尔投票: 摩尔投票是一种用来解决绝对众数问题的算法。 什么是绝对众数呢? 在一个集合中,如果一个元素…...

后端 .net7 Minimal API 限流中间件(微信小程序无师自通十)

我的微信小程序使用.net7 Minimal API 作为后端,当服务器摆上公网后,可以观察到很多的攻击行为和暴力访问。所以,我需要使用微软的限流中间件部署相应的功能在服务器上 关键字: AddFixedWindowLimiter using Microsoft.AspNetCo…...

背上沉重的书包准备面试之react篇

目录 react特性? react生命周期? state和props区别 react中setState执行机制? 在react类组件形式中,setState第二个参数的作用? react事件机制? react事件绑定方式有哪些? react组件之间…...

OpenCV-Python中的图像处理-霍夫变换

OpenCV-Python中的图像处理-霍夫变换 霍夫变换霍夫直线变换霍夫圆环变换 霍夫变换 霍夫(Hough)变换在检测各种形状的技术中非常流行,如果要检测的形状可以用数学表达式描述,就可以是使用霍夫变换检测它。即使要检测的形状存在一点破坏或者扭曲也是可以使…...

W5500-EVB-PICO做UDP Client进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试,本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段: 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

npm install 中 --save 和 --save-dev 是什么?

npm,全名 Node Package Manager,套件管理工具,package.json 会记下你在项目中安装的所有套件。 假设在项目中安装 lodash npm i --save lodash这样在 dependencies 中会出现: 如果修改了导入方式: npm i --save-dev …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...