看网上例子都是加了一个"version"(版本号)的字段,然后更新语句是:
// 查询需要更新的数据的版本号
SELECT VERSION FROM `ubo_crowd` WHERE crowd_id = 12;
// 更新数据,这里#{version}表示上面查询得到的版本号
UPDATE `ubo_crowd` SET STATUS=2,VERSION=VERSION+1 WHERE crowd_id=12 AND VERSION=#{version};
我现在设计了一张stock
的表,一个id
和num
字段,感觉num
字段直接就可以当作版本号的作用
// num 是之前 select 语句读取出来的
const results = await this.app.mysql
.query('update stock set num = num - 1 where id = ? and num = ?', [id, num])
我觉得乐观锁也是靠 MySQL 的行锁( update 语句的缘故)
1
mikulch 2019-10-20 12:19:52 +08:00
都学会自问自答了。
|
2
mcfog 2019-10-20 12:23:59 +08:00 via Android
明天要做个退款 /支付失败后恢复库存的功能,gg
|
3
hdbzsgm 2019-10-20 12:26:14 +08:00 2
靠某个值 不如靠一个单调递增的版本号那么靠谱 ABA 了解一下
|
4
salamanderMH OP @mcfog 有订单表,退款后也可以加回去。
|
5
salamanderMH OP @hdbzsgm 这里更新都会上锁,是 X 锁,也是靠谱的
|
6
hhhsuan 2019-10-20 13:14:59 +08:00
在一个名词后面加个问号,并不能构成一个问题
|
7
mcfog 2019-10-20 13:23:25 +08:00 via Android
@salamanderMH 说的就是任何一个地方有加的逻辑你的 num 乐观锁就不成立了
|
8
salamanderMH OP @mcfog 为什么不成立了?
|
9
scemsjyd 2019-10-20 21:17:41 +08:00 via Android 1
了解下 ABA
|
10
salamanderMH OP |