您现在的位置是:网站首页 > 心得笔记
分布式锁
简介在处理高并发时,如果不加锁,可能会出现多个请求同时更新同一数据的情况,最终导致数据不一致。因此,在实际应用中,我们应根据具体业务场景选择合适的锁机制来确保数据的一致性和准确性。
Redis实现分布式锁
$orderLock = Redis::setnx($lockCacheKey, 1);
if($orderLock === 0){ //锁失败
// 防止死锁
if(Redis::ttl($lockCacheKey) == -1){
Redis::expire($lockCacheKey, 60);
}
return CommonResponse([], ResponseCode::PARAMETER_ERROR, "一分钟内请勿重复提交");
}
Redis::expire($lockCacheKey, 60);//缓存MySQL实现分布式锁
注意: SELECT ... FOR UPDATE 必须在事务中才会生效。
try {
$conn = app('db');
$conn->beginTransaction();
$sql = "SELECT * FROM `products` WHERE `id` = 1 FOR UPDATE";
$product = app('db')->selectOne($sql);
if ($product->store <= 0) {
throw new \Exception('商品库存不足');
}
$new_store = $product->store - 1;
app('log')->info("当前剩余库存为: {$new_store} 个");
$sql = "UPDATE `products` SET `store` = {$new_store} WHERE `id` = 1";
$conn->update($sql);
$conn->commit();
} catch (\Exception $e) {
app('log')->error("库存更新失败: " . $e->getMessage());
$conn->rollback();
}转链地址mp.weixin.qq.com/s/zWONn8Zj9USVgGNXfX7zgg