业务场景
库存操作。A用户请求出库操作,但由于业务执行期间在花费了较长时间,此次的请求未完成时,B用户进行了另一个出库操作,此时B用户获取到的是A用户操作出库前的数量。此时A进行了扣减并提交了事务。B用户再进行扣减,导致库存总量不对的情况。
之前碰到类似的场景较少,请问有什么建议或者手段吗
数据库字段加版本号,version,操作的时候带上
update xx,version=version+1 where version=1
A操作,update xx,version=version+1 where version=1
B操作成功,update xx,version=version+1 where version=1,版本号变成了2
后面A会更新会失败
出库业务到真正更新时,做如下处理:
1、加锁:select ... for update
2、再次校验库存余量是否足够
出库处理
由于并发请求更新数据库可能导致数据不一致的问题,我们可以采用以下几种解决方案以避免这种情况的发生:
通过设置权限限制并发操作的次数,避免出现过多的并发请求,降低数据不一致的风险。
可以参考参考资料中的博客[1]和[3],通过限制并发操作的次数来解决问题。
引入锁机制,保证同一时间只有一个用户对数据库进行操作,避免数据冲突。
可以采用乐观锁和悲观锁来实现,具体应根据场景选择合适的锁机制。悲观锁适用于查少改多的场景,乐观锁适用于查多改少而经常被并发修改的数据。具体实现的方式可以参考参考资料中的博客[2]。
批量查询数据,减少调用数据库的次数,尽量避免并发操作。
可以将每次查询的结果都存在列表中,避免反复调用数据库,减少并发操作的次数。具体实现的方法可以参考参考资料中的段落3。
在实体类中设置一个不映射到数据库字段的状态字段,并进行相应的注解处理。
可以参考参考资料中的段落4,通过在实体类中添加注解来解决问题。
以上是几种常见的解决方案,其中最适用的方法应根据实际需求和场景来选择。另外,为了避免类似问题的出现,还可以加入限流和数据迁移等技术手段。具体实现的方法可以参考参考资料中的段落8和段落10。