django解决订单并发问题【推荐】
并发处理
在多个用户同时发起对同一个商品的下单请求时,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常。
解决办法:
悲观锁
当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作,使用类似如下语法
select stock from tb_sku where id=1 for update; SKU.objects.select_for_update().get(id=1)
悲观锁类似于我们在多线程资源竞争时添加的互斥锁,容易出现死锁现象,采用不多。
乐观锁
乐观锁并不是真实存在的锁,而是在更新的时候判断此时的库存是否是之前查询出的库存,如果相同,表示没人修改,可以更新库存,否则表示别人抢过资源,不再执行库存更新。类似如下操作
update tb_sku set stock=2 where id=1 and stock=7; SKU.objects.filter(id=1, stock=7).update(stock=2)
任务队列
将下单的逻辑放到任务队列中(如celery),将并行转为串行,所有人排队下单。比如开启只有一个进程的Celery,一个订单一个订单的处理。
总结
以上所述是小编给大家介绍的django解决订单并发问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关推荐
-
django迁移数据库错误问题解决
django.db.migrations.graph.NodeNotFoundError: Migration order.0002_auto_20181209_0031 dependencies reference nonexistent parent node ('user', '0001_initial') 删除所有的pyc文件,迁移文件 然后重新运行 python manage.py makemigrations django.db.utils.InternalError: (1060,
-
Django如何防止定时任务并发浅析
前言 django提供了commands类,允许我们编写命令行脚本,并且可以通过python manage.py拉起. 了解commands 具体django commands如何使用,大家参考官方文档即可:https://docs.djangoproject.com/en/2.2/howto/custom-management-commands/ 一个坑 使用时遇到一个坑:在commands运行中的异常并不会打印到屏幕上,它要求我们必须抛出CommandError类型的异常才能被打印到屏幕中,
-
Django框架中数据的连锁查询和限制返回数据的方法
连锁查询 通常我们需要同时进行过滤和排序查询的操作. 因此,你可以简单地写成这种"链式"的形式: >>> Publisher.objects.filter(country="U.S.A.").order_by("-name") [<Publisher: O'Reilly>, <Publisher: Apress>] 你应该没猜错,转换成SQL查询就是 WHERE 和 ORDER BY 的组合: SELEC
-
django实现登录时候输入密码错误5次锁定用户十分钟
在学习django的时候,想要实现登录失败后,进行用户锁定,切记录锁定时间,在网上找了很多资料,但是都感觉不是那么靠谱,于是乎,我开始了我的设计,其实我一开始想要借助redis呢,但是想要先开发一个简单的,后续在拆分后,然后在去进行拆分, 这样也是很接近我们在真实的开发中所遇到问题. 我的思路是: 输入账号密码>是否已经登录>提示已经登录 输入账号密码>错误次数少于6次>校验密码>登录成功,记录登录时间,错误次数清空,记录登录状态 输入账号密码>错误大于六次>提示
-
基于Django的乐观锁与悲观锁解决订单并发问题详解
前言 订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题. 在解释如何解决订单并发问题之前,需要先了解一下什么是数据库的事务.(我用的是mysql数据库,这里以mysql为例) 1) 事务概念 一组mysql语句,要么执行,要么全不不执行. 2) mysql事务隔离级别 Read Committed(读取提交内容) 如果是Django2.0以下的版本,需要去修改到这个隔离级别,不然乐观锁操作时无法读取已经被修改的数据 Repea
-
django解决订单并发问题【推荐】
并发处理 在多个用户同时发起对同一个商品的下单请求时,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常. 解决办法: 悲观锁 当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作,使用类似如下语法 select stock from tb_sku where id=1 for update; SKU.objects.select_for_update().get(id=1) 悲观锁类似于我们在多线程资源竞争时添加的互斥锁,容易出现死锁现象,采用不多. 乐
-
Redis中的String类型及使用Redis解决订单秒杀超卖问题
本系列将和大家分享Redis分布式缓存,本章主要简单介绍下Redis中的String类型,以及如何使用Redis解决订单秒杀超卖问题. Redis中5种数据结构之String类型:key-value的缓存,支持过期,value不超过512M. Redis是单线程的,比如SetAll & AppendToValue & GetValues & GetAndSetValue & IncrementValue & IncrementValueBy等等,这些看上去像是组合命
-
PHP解决高并发的优化方案实例
我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为100ms,同时,系统内有20台Apache的Web服务器,配置MaxClients为500个(表示Apache的最大连接数目). 那么,我们的Web系统的理论峰值QPS为(理想化的计算方式): 20*500/0.1 = 100000 (10万QPS) 咦?我们的系统似乎很强大,1秒钟可以处理完10万的
-
如何利用Redis锁解决高并发问题详解
redis技术的使用: redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动... redis之所以能解决高并发的原因是它可以直接访问内存,而以往我们用的是数据库(硬盘),提高了访问效率,解决了数据库服务器压力. 为什么redis的地位越来越高,我们为何不选择memcache,这是因为memcache只能存储字符串,而redis存储类型很丰富(例如有字符串.LIST.SET等),memcache每个值最大只能存储1M,存储资源非常有限,十分消耗内
-
PHP利用Mysql锁解决高并发的方法
前面写过利用文件锁来处理高并发的问题的,现在我们说另外一个处理方式,利用Mysql的锁来解决高并发的问题 先看没有利用事务的时候并发的后果 创建库存管理表 CREATE TABLE `storage` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `number` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=l
-
C#解决SQlite并发异常问题的方法(使用读写锁)
本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题. SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写.Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用.但在C#中未提供类似功能. 作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标. using System; usin
-
PHP使用文件锁解决高并发问题示例
本文实例讲述了PHP使用文件锁解决高并发问题.分享给大家供大家参考,具体如下: 新建一个.txt文件,文件中什么都不用写. [一].阻塞(等待)模式:(只要有其他进程已经加锁文件,当前进程会一直等其他进程解锁文件) <?php //连接数据库 $con=mysqli_connect("192.168.2.186","root","root","test"); //查询商品数量是否大于0,大于0才能下单,并减少库存 $fp
-
django 解决manage.py migrate无效的问题
问题描述: 已有的model,修改之后,想重新建模,于是将migrations文件夹中除__init__.py之外其他文件都删掉,再次执行以下步骤python manage.py makemigrations确认成功,执行python manage.py migrate,提示No migrations to apply. 表示一脸懵逼.再次修改,指定表名,再次尝试,发现问题依旧,表示二脸懵逼 排查过程 python manage.py dbshell 进到数据库里面,查看是否表已存在 结果:表不
-
Django 项目布局方法(值得推荐)
一.这种布局的优点 项目中的每个应用都相对独立,方便以后拿出来重用. 这样的布局会促使你在开发过程中考虑每个应用的重用性. 开发.测试.生产等不同的环境都有各自独立的配置文件,方便配置项的共享和定制. 不同的环境都有各自独立的 pip requirements 文件. 每个应用都有各自的 templates 和 static 目录,你可以通过项目级的 templates 和 static 目录中的文件对各应用中的相应内容进行覆盖. 对 models.views.managers 等的测试都各自保
随机推荐
- 在Go语言程序中使用gojson来解析JSON格式文件
- 关于使用存储过程创建分页
- 下载网站图片代码并且解析乱码
- C++重载运算符的规则详解
- Javascript基础知识(二)事件
- 老版本PHP转义Json里的特殊字符的函数
- js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
- Mac系统下Webstorm快捷键整理大全
- 详解javascript高级定时器
- Java的枚举类型使用方法详解
- 解决JS无法调用Controller问题的方法
- Windows Powershell 变量的作用域
- VUE利用vuex模拟实现新闻点赞功能实例
- windows服务器记录3389远程桌面IP策略
- httpd.exe cpu占有很高的解决方法
- Android 5.0最应该实现的8个期望
- Go语言中一些不常见的命令参数详解
- PHP实现的AES 128位加密算法示例
- Python第三方Window模块文件的几种安装方法
- python+opencv 读取文件夹下的所有图像并批量保存ROI的方法