乐观锁?

2019-10-20 12:07:14 +08:00
 salamanderMH

问题

看网上例子都是加了一个"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的表,一个idnum字段,感觉num字段直接就可以当作版本号的作用

// num 是之前 select 语句读取出来的
const results = await this.app.mysql
                .query('update stock set num = num - 1 where id = ? and num = ?', [id, num])

我觉得乐观锁也是靠 MySQL 的行锁( update 语句的缘故)

2333 次点击
所在节点    问与答
10 条回复
mikulch
2019-10-20 12:19:52 +08:00
都学会自问自答了。
mcfog
2019-10-20 12:23:59 +08:00
明天要做个退款 /支付失败后恢复库存的功能,gg
hdbzsgm
2019-10-20 12:26:14 +08:00
靠某个值 不如靠一个单调递增的版本号那么靠谱 ABA 了解一下
salamanderMH
2019-10-20 13:04:11 +08:00
@mcfog 有订单表,退款后也可以加回去。
salamanderMH
2019-10-20 13:12:06 +08:00
@hdbzsgm 这里更新都会上锁,是 X 锁,也是靠谱的
hhhsuan
2019-10-20 13:14:59 +08:00
在一个名词后面加个问号,并不能构成一个问题
mcfog
2019-10-20 13:23:25 +08:00
@salamanderMH 说的就是任何一个地方有加的逻辑你的 num 乐观锁就不成立了
salamanderMH
2019-10-20 17:05:37 +08:00
@mcfog 为什么不成立了?
scemsjyd
2019-10-20 21:17:41 +08:00
了解下 ABA
salamanderMH
2019-10-20 21:56:52 +08:00
@hdbzsgm @scemsjyd
我看了下,如果可增可减的话,确实有 ABA 这个问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/611089

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX