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

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

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

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

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

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

2279 次点击
所在节点    问与答
39 条回复
konar
2020-12-03 16:36:48 +08:00
if (insertSucceeded)
set count = count + 1
konar
2020-12-03 16:37:57 +08:00
@konar 哦 count 在订单表不是用户表啊,那忽略吧
oott123
2020-12-03 16:47:06 +08:00
unique(user_id, count)
这样至少不会重复
TomVista
2020-12-03 17:03:34 +08:00
@oott123

这个可行,

select count(*) form order where order.user = user;

insert count to order;

大不了冲突几次,反正都没有事务 锁了,

我这里是能执行数据库语句的,然后写个文档备注一下.

感谢老哥,如果没有更好的方案就这个了
duwan
2020-12-03 17:15:27 +08:00
串行执行被
tabris17
2020-12-03 17:19:21 +08:00
user,count 加唯一索引
TomVista
2020-12-03 17:20:17 +08:00
@duwan

我这里 请求部分 只能做到,发个 request, 等着 response, 没有办法串行. 条件不允许.
haoz1w0w
2020-12-03 17:29:05 +08:00
非要用 count 么 用插入时间倒排不就算出来了
haoz1w0w
2020-12-03 17:29:21 +08:00
哦 是正排
fish267
2020-12-03 17:30:43 +08:00
放 redis? 我瞎说的
tabris17
2020-12-03 17:33:17 +08:00
还有个笨办法,分两步操作:

先 insert,count 字段留空;
然后再 update orderTab set count=(select count(*) from orderTab where user_id=? and id<=?) where id=?
TomVista
2020-12-03 17:44:08 +08:00
@haoz1w0w emm,不合适

insert order

select count

update order_count

这个好像不太保准,有小概率,count 丢失,然后回滚和异常处理,目前这个技术栈也没法处理,unique(user_id, count) 要稳妥,方便
TomVista
2020-12-03 17:45:16 +08:00
@fish267 不行,就我一个菜鸡,绝不给自己增加工作量
TomVista
2020-12-03 17:45:58 +08:00
@tabris17

#12

这个不太妥
zzzmh
2020-12-03 17:47:08 +08:00
我一直用 update table set count = count + 1
不过据说也不是最稳的
Immortal
2020-12-03 17:49:51 +08:00
这不是乐观锁就可以实现的么
TomVista
2020-12-03 17:53:11 +08:00
@Immortal 选技术栈做不到锁,就很尴尬,还有一个半残的事务机制,
yao978318542
2020-12-03 18:26:43 +08:00
redis 队列
tabris17
2020-12-03 18:30:39 +08:00
@TomVista 两步走是最稳妥的方法,唯一索引插入冲突还要做异常处理,更加麻烦
redtea
2020-12-03 18:36:57 +08:00
这个字段存数据库有什么用?我感觉显示时可以实时算出来。
退货、交易关闭场景考虑到了没有。

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

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

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

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

© 2021 V2EX