订单并发这个问题我想你们都是有必定认识的,这里我说一下个人一些浅见,我会尽量的让你们了解如何解决这类问题。python
在解释如何解决订单并发问题以前,须要先了解一下什么是数据库的事务。(我用的是mysql数据库,这里以mysql为例)mysql
1) 事务概念redis
一组mysql语句,要么执行,要么全不不执行。sql
2) mysql事务隔离级别数据库
Read Committed(读取提交内容)多线程
若是是Django2.0如下的版本,须要去修改到这个隔离级别,否则乐观锁操做时没法读取已经被修改的数据并发
RepeatableRead(可重读)app
这是这是Mysql默认的隔离级别,能够到mysql的配置文件中去修改;post
transcation-isolation = READ-COMMITTEDatom
在mysql配置文件中添加这行而后重启mysql就能够将事务隔离级别修改至Read Committed
其余事务知识这里不会用到就不浪费时间去作介绍了。
悲观锁:开启事务,而后给mysql的查询语句最后加上for update。
这是在干什么呢。可能你们有些不理解,其实就是给资源加上和多线程中加互斥锁同样的东西,确保在一个事务结束以前,别的事务没法对该数据进行操做。
下面是悲观锁的代码,加锁和解锁都是须要消耗CPU资源的,因此在订单并发少的状况使用乐观锁会是一个更好的选择。
而后就是乐观锁查询了,相比悲观锁,乐观锁其实并不能称为是锁,那么它是在作什么事情呢。
实际上是在你要进行数据库操做时先去查询一次数据库中商品的库存,而后在你要更新数据库中商品库存时,将你一开始查询到的库存数量和商品的ID一块儿做为更新的条件,当受影响行数返回为0时,说明没有修改为功,那么就是说别的进程修改了该数据,那么你就能够回滚到以前没有进行数据库操做的时候,从新查询,重复以前的操做必定次数,若是超过你设置的次数仍是不能修改那么就直接返回错误结果。
该方法只适用于订单并发较少的状况,若是失败次数过多,会带给用户不良体验,同时适用该方法要注意数据库的隔离级别必定要设置为Read Committed 。
最好在使用乐观锁以前查看一下数据库的隔离级别,mysql中查看事物隔离级别的命令为
乐观锁代码
本文来自:
https://blog.csdn.net/qq_36012543/article/details/79679690?utm_source=copy
-END-