商品库超卖的乐观锁
商品库存的乐观锁实现。
出现场景:
避免商品出现超卖(即成功下单的订单中商品的库存数量大于商品现有的库存量,则称为商品超卖)的问题,核心技术是利用数据库的事务锁机制,即不允许同一商品的库存记录在同一时间被不同的两个数据库事务修改。
功能实现:
在前柔性事务介绍中所提到的,用户在进行商品下单操作中,会进行一系列的业务逻辑判断和操作,对于商品库存信息这一访问热点数据,如果采用数据库的悲观锁(比如select语句带for update)模式,则会给订单处理带来很大的性能阻塞,所以会采用乐观锁的方式实现商品库存的操作。
实现的方式也比较简单,也就是在最后执行库存扣减操作时,将事务开始前获取的库存数量带入到SQL语句中与目前数据库记录中的库存数量进行判断,如果数量相等,则该条更新库存的语句成功执行;如果不相等,则表示该商品的库存信息在当前事务执行过程中已经被其他事务修改,则会放弃该条update的执行,可以采用重试的机制重新执行该事务,避免商品超卖的发生。具体的SQL语句示意如下:
Update auction_auctions set quantity=#inQuantity#,where auction_id=#itemId# and quantity=#dbQuantity# 其中#dbQuantity#为事务中在update语句执行前,通过select语句获取到的商品库存数量
以上就是这次的全部内容!