深圳石岩建网站,权威发布李建,wordpress微博登陆,重庆app推广公司目录 什么是超卖#xff1f; 乐观锁和悲观锁的定义
悲观锁#xff1a;
乐观锁#xff1a;
乐观锁的实现方式
1.版本号 2.CAS法 什么是超卖#xff1f;
举个例子#xff1a;订单系统中#xff0c;用户在执行下单操作时#xff0c;可能同一时间有无数个用户同时下单 乐观锁和悲观锁的定义
悲观锁
乐观锁
乐观锁的实现方式
1.版本号 2.CAS法 什么是超卖
举个例子订单系统中用户在执行下单操作时可能同一时间有无数个用户同时下单当a用户的请求查询当前商品库存时发现当前的商品剩余5件在执行生成订单并减少库存时线程切换了此时b用户执行了查询操作发现还是剩余5件并进行了下单操作这样就导致了这件商品被卖掉了两次
正常的情况如下 发生线程切换产生异常的情况 乐观锁和悲观锁的定义
悲观锁
认为线程安全问题一定会发生因此在操作数据之前先获取锁确保线程串行执行。例如Synchronized、Lock都属于悲观锁
乐观锁
认为线程安全问题不一定会发生因此不加锁只是在更新数据时去判断有没有其它线程对数据做了修改。
如果没有修改则认为是安全的自己才更新数据。
如果已经被其它线程修改说明发生了安全问题此时可以重试或异常
乐观锁的实现方式
1.版本号
给商品加上版本号字段如果查询到就让其version1,在修改执行的时候先判断版本号是不是正确的如果是让其版本号发生变化并执行扣减如果不是就说明当前商品已经卖出 2.CAS法
CAS流程如下
获取目标内存位置的当前值。检查当前值是否与预期值相等。如果相等则将新值写入目标内存位置否则放弃写入操作可能是重新读取当前值并重试整个CAS操作。 比如当前的订单系统中就可以使用查询到的库存作为预期值修改的时候进行判定如果是库存和第一次查询到的一样就执行不一样就取消执行这样就能够保证原子性 具体实现只需要更改sql语句就可以做到
UPDATE users
SET stockstock-1
WHERE id 10 and stock #{第一次查询到的库存};