//查询
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