没有锁,事务,如何保证+1 操作

2020-12-03 16:30:40 +08:00
 TomVista

订单表里有个字段 count, 表示用户的第几个订单

在没有锁,事务的前提下,

新增订单的时候怎么保证 count 是正确的.

不要问为啥没有锁和事务,问就祭天,

2412 次点击
所在节点    问与答
39 条回复
Immortal
2020-12-03 18:41:42 +08:00
@TomVista #17
建议查询下乐观锁在数据库中的应用
TomVista
2020-12-03 18:46:10 +08:00
@Immortal 确实可行
rambo92
2020-12-03 18:46:20 +08:00
试试无锁思想:CAS?

`update xx set count = count + 1 where id = xxx count = excepted_count`
如果 update 行数不等于 1, 重试该动作,直到成功
TomVista
2020-12-03 18:47:08 +08:00
@tabris17 我的想法是 唯一冲突 后,报个网络错误,然后用户重新点一次
TomVista
2020-12-03 18:47:51 +08:00
@redtea 和订单的自增 id 一起生成 订单的 流水号
TomVista
2020-12-03 18:59:30 +08:00
@rambo92 我搞不定这个
TomVista
2020-12-03 19:29:04 +08:00
@rambo92 我这边每次数据库改动都是一个 http 请求 , 我仔细研究了一下,我这个场景不合适用这个,
sampeng
2020-12-03 19:32:18 +08:00
扔队列,消费者交叉执行。始终只有一个人在 insert 或者 update
cxshun
2020-12-03 19:35:42 +08:00
没有锁的情况下只有用 CAS 了,先查询原 count,再更新 count 的同时判断目前的 count 是不是等于之前的 count 。
wellsc
2020-12-03 19:46:46 +08:00
Cas,跳表,日志数据库
seth19960929
2020-12-03 20:25:13 +08:00
这不明显是用乐观锁吗😮
rambo92
2020-12-03 21:57:59 +08:00
@TomVista 和是否 http 请求无关啊。
TomVista
2020-12-04 08:47:59 +08:00
@rambo92 那可能我理解错了,我再看看
Immortal
2020-12-04 09:36:34 +08:00
“乐观锁和 cas, 因为 count 需要前端额外查询一遍,也没办法保证业务的正确性”
select for update
老哥知识面还有待拓宽
rambo92
2020-12-04 10:43:12 +08:00
"所有的数据库操作都是在前端使用 http 进行请求,所以有些后端能用的东西,到这里就不合适了,
目前看到的队列和唯一索引比较合适,

乐观锁和 cas, 因为 count 需要前端额外查询一遍,也没办法保证业务的正确性"

大家都散了吧。。。
TomVista
2020-12-04 10:57:14 +08:00
@Immortal 明白了,我后续再去看看,哪里理解错了
haoz1w0w
2020-12-04 16:09:12 +08:00
@TomVista 我的意思是实时计算
TomVista
2020-12-04 16:31:10 +08:00
@haoz1w0w 场景不允许

count 目前只用于生成订单号, 订单号有检索需求,比如 cms 中的订单查找
PiersSoCool
2020-12-04 17:11:24 +08:00
单机

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

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

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

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

© 2021 V2EX