应用场景 某一商品的秒杀创建订单扣减库存的sql
<update id="descItemsSpecStock"> UPDATE items_spec SET stock = stock - #{buyCount} WHERE id = #{itemSpecId} AND stock >= #{buyCount} </update>
考虑未加分布式锁并发场景下,数据库中执行扣减库存sql,由于表的行锁,并发更新变成串行执行update sql。此时会导致大量的对同一条数据的update语句堆积,数据库压力增高。这意味着,大量的事务没办法及时提交,进而导致应用会一直占用数据库连接而不能及时释放。数据库链接资源是有限的,从而导致了一系列问题。
如何解决?把数据库的压力转移到应用层?使用分布式锁。
考虑加入分布式锁的并发场景,对同一件商品的扣减库存时加上分布式锁,此时,获得锁的去执行update sql,未获得锁的应用则进入阻塞状态。此时,数据没有产生update 语句的堆积,数据库压力减小。事务和数据库链接也能得到及时的提交和释放