这是经常会遇到的问题,比如有以下场景:
项目中有B端和C端两个库,两者进行双向同步,B端修改商品库存时C端同时下单,这时候应该怎么解决数据冲突问题?
库存预占
C端下单时先锁定库存(非直接扣减),生成预占记录并设置超时时间(如15分钟)。支付成功后转为正式扣减;超时则释放库存。而B端修改库存时(如调拨、盘点),只能操作非预占状态的库存,避免与订单冲突。
redis分布式锁
对同一商品ID的操作(B端修改或C端下单)需先获取分布式锁,确保同一时间仅一个操作生效
// 伪代码示例:使用Redis锁
String lockKey = "product_lock:" + productId;
String requestId = UUID.randomUUID().toString();
if (redis.setnx(lockKey, requestId, 30)) { // 锁超时30秒
try {
// 执行库存操作
} finally {
redis.releaseLock(lockKey, requestId); // 释放锁
}
}