django 保存订单乐观锁的使用
后端在生成订单表的时候,牵扯到如下的知识点:
1 事物
2 高并发
3 时间函数的使用
一,事务:
from django.db import transaction save_id = transaction.savepoint() # 创建保存点 transaction.savepoint_rollback(save_id) # 回退(回滚)到保存点 transaction.savepoint_commit(save_id) # 提交保存点
例子用法:
from django.db import transaction with transaction.atomic(): # 创建保存点
save_ponit=transaction.savepoint()
try:
# 4、生成订单基本信息表
order = OrderInfo.objects.create(
......
)
except:
transaction.savepoint_rollback(save_ponit)
else:
transaction.savepoint_commit(save_ponit)
2 高并发
当多个用户同时去抢同一个商品的时候,就有可能会出现库存不足,把一些错误的数据保存到数据库中
解决的方法: 采用悲观锁,采用乐观锁,采用队列,排队下单
1,悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。
悲观锁用法:
select_for_update(nowait=False) #nowait=False默认,置为True则使查询不阻塞,如果有其它事务持有冲突的锁,则报databaseError错误 返回queryset,并将需要更新的行锁定,类似于SELECT ... FOR UPDATE的操作。entries
=
Entry.objects.select_for_update().
filter
(author
=
request.user)
所有匹配的entries都会被锁定直到此次事务结束。
2,乐观锁
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,
先查询
解析以上代码,先查询数据库库存数量,定义个库存变量,然后当保存订单的时候已该字段为过滤条件进行过滤修改,
如果修改失败,则返回0,并重试3次(自定义重试次数),
该方法只适用于订单并发较少的情况,如果失败次数过多,会带给用户不良体验,同时适用该方法要注意数据库的隔离级别一定要设置为Read Committed 。
最好在使用乐观锁之前查看一下数据库的隔离级别,mysql中查看事物隔离级别的命令为
select @@global.tx_isolation;
3,时间函数的使用
from datetime import datetime
order_id = datetime.now().strftime('%Y%m%d%H%M%S') + '%06d' % user.id
上面这个一般作为商品订单号使用。
详情信息可以:
https://blog.csdn.net/qq_36012543/article/details/79679690?utm_source=copy
django 保存订单乐观锁的使用的更多相关文章
- Django - ORM - 事务, 乐观锁, 悲观锁
事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...
- 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见
订单并发这个问题我想大家都是有一定认识的,这里我说一下我的一些浅见,我会尽可能的让大家了解如何解决这类问题. 在解释如何解决订单并发问题之前,需要先了解一下什么是数据库的事务.(我用的是mysql数据 ...
- Django的乐观锁与悲观锁实现
1) 事务概念 一组mysql语句,要么执行,要么全不不执行. 2) mysql事务隔离级别 Read Committed(读取提交内容) 如果是Django2.0以下的版本,需要去修改到 ...
- 【mysql】mysql增加version字段实现乐观锁,实现高并发下的订单库存的并发控制,通过开启多线程同时处理模拟多个请求同时到达的情况 + 同一事务中使用多个乐观锁的情况处理
mysql增加version字段实现乐观锁,实现高并发下的订单库存的并发控制,通过开启多线程同时处理模拟多个请求同时到达的情况 ==================================== ...
- django-订单并发处理--悲观锁和乐观锁
冲突比较少的时候,使用乐观锁. 冲突比较多的时候,使用悲观锁. (1) 悲观锁 select * from df_goods_sku where id=17 for update; 悲观锁获取 ...
- 从事务隔离级别谈到Hibernate乐观锁,悲观锁
数据库的事务,是指作为单个逻辑工作单元执行的一系列操作. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源.通过将一组相关操作组合为一个要么全部成功要么全部失败的单 ...
- django中ORM中锁和事务
一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...
- mysql乐观锁总结和实践
乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突 ...
- mysql乐观锁总结和实践--转
原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...
随机推荐
- 【jdbc】【c3p0】c3p0三种配置方式【整理】
c3p0三种配置方式 c3p0的配置方式分为三种,分别是1.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文件3.类路径下提供一个c3p0-config.xml ...
- zabbix结合grafana
一.下载grafana 下载地址: http://docs.grafana.org/installation/rpm/ https://s3-us-west-2.amazonaws.com/grafa ...
- Monkey&Monkey Runner使用
adb shell monkey -p com.ajb.sp -s 500 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v ...
- [Training Video - 4] [Groovy] Function in detail
Employee.log=log Employee e1 = new Employee() Employee e2 = new Employee() e1.name = "A" e ...
- easyui页签更新
1.首先引入这个js文件 <script src="/Scripts/tabs.js" type="text/javascript"></sc ...
- web桌面
http://www.pengyaou.com/LegendsZ/eg/WebWindowSystem/
- poj 1066 Treasure Hunt (未完)
#include<stdio.h> #include<math.h> #include<stdlib.h> #define eps 1e-8 #define zer ...
- 并发编程CAS操作
并发编程CAS操作 简介 CAS即compare and swap,中文就是比较并交换 CAS是Java并发包的基石 原理 其实CAS的原理相对来说比较简单.将要被改变的数据和期望的值作比较,当两个值 ...
- idea 提示Resource registered by this uri is not recognized (Settings | Languages & Frameworks | Schemas and DTDs)
idea出现如上图所示的错误提示时,可以用如下方式解决 点击红色代码部分,鼠标悬停后出现红色灯泡,如下图所示 点击灯泡后,选择第一个选项就可以解决了
- 编写高质量代码改善C#程序的157个建议——建议68:从System.Exception或其他常见的基本异常中派生异常
建议68:从System.Exception或其他常见的基本异常中派生异常 微软建议:从System.Exception或其他常见基本异常之一派生异常.在Visual Studio中输入Excepti ...