«
php laravel 抢红包防止并发超卖

时间:2021-5-17    作者:网络剑客    分类: php


场景

乐观锁

//查询
select version from goods WHERE id= 100
//更新
update goods set num = num - 1, version = version + 1 WHERE id= 100 AND num > 0 AND version = 查到的version;

这种方式采用了版本号的方式,其实也就是 CAS 的原理。

假设此时 version = 100, num = 1; 100 个线程进入到了这里,同时他们 select 出来版本号都是 version = 100。

然后直接 update 的时候,只有其中一个先 update 了,同时更新了版本号。

那么其他 99 个在更新的时候,会发觉 version 并不等于上次 select 的 version,就说明 version 被其他线程修改过了。那么我就放弃这次 update

标签: php