订单表里有个字段 count, 表示用户的第几个订单
在没有锁,事务的前提下,
新增订单的时候怎么保证 count 是正确的.
不要问为啥没有锁和事务,问就祭天,
订单表里有个字段 count, 表示用户的第几个订单
在没有锁,事务的前提下,
新增订单的时候怎么保证 count 是正确的.
不要问为啥没有锁和事务,问就祭天,
支持事务,
但是事务的隔离级别未知,
事务内部上下文隔离
select count form ;
insert count ; // 这里拿不到上一句的count
好像用处不太大
1
konar Dec 3, 2020
if (insertSucceeded)
set count = count + 1 |
3
oott123 Dec 3, 2020 via Android unique(user_id, count)
这样至少不会重复 |
4
TomVista OP @oott123
这个可行, select count(*) form order where order.user = user; insert count to order; 大不了冲突几次,反正都没有事务 锁了, 我这里是能执行数据库语句的,然后写个文档备注一下. 感谢老哥,如果没有更好的方案就这个了 |
5
duwan Dec 3, 2020
串行执行被
|
6
tabris17 Dec 3, 2020 user,count 加唯一索引
|
8
haoz1w0w Dec 3, 2020
非要用 count 么 用插入时间倒排不就算出来了
|
9
haoz1w0w Dec 3, 2020
哦 是正排
|
10
fish267 Dec 3, 2020
放 redis? 我瞎说的
|
11
tabris17 Dec 3, 2020
还有个笨办法,分两步操作:
先 insert,count 字段留空; 然后再 update orderTab set count=(select count(*) from orderTab where user_id=? and id<=?) where id=? |
12
TomVista OP @haoz1w0w emm,不合适
insert order select count update order_count 这个好像不太保准,有小概率,count 丢失,然后回滚和异常处理,目前这个技术栈也没法处理,unique(user_id, count) 要稳妥,方便 |
15
zzzmh Dec 3, 2020
我一直用 update table set count = count + 1
不过据说也不是最稳的 |
16
Immortal Dec 3, 2020
这不是乐观锁就可以实现的么
|
18
yao978318542 Dec 3, 2020
redis 队列
|
20
redtea Dec 3, 2020
这个字段存数据库有什么用?我感觉显示时可以实时算出来。
退货、交易关闭场景考虑到了没有。 |
23
summertimesad Dec 3, 2020 试试无锁思想:CAS?
`update xx set count = count + 1 where id = xxx count = excepted_count` 如果 update 行数不等于 1, 重试该动作,直到成功 |
28
sampeng Dec 3, 2020 via iPhone
扔队列,消费者交叉执行。始终只有一个人在 insert 或者 update
|
29
cxshun Dec 3, 2020
没有锁的情况下只有用 CAS 了,先查询原 count,再更新 count 的同时判断目前的 count 是不是等于之前的 count 。
|
30
wellsc Dec 3, 2020 via iPhone
Cas,跳表,日志数据库
|
31
SethShi Dec 3, 2020 via Android
这不明显是用乐观锁吗😮
|
32
summertimesad Dec 3, 2020 via Android
@TomVista 和是否 http 请求无关啊。
|
34
Immortal Dec 4, 2020
“乐观锁和 cas, 因为 count 需要前端额外查询一遍,也没办法保证业务的正确性”
select for update 老哥知识面还有待拓宽 |
35
summertimesad Dec 4, 2020
"所有的数据库操作都是在前端使用 http 进行请求,所以有些后端能用的东西,到这里就不合适了,
目前看到的队列和唯一索引比较合适, 乐观锁和 cas, 因为 count 需要前端额外查询一遍,也没办法保证业务的正确性" 大家都散了吧。。。 |
39
PiersSoCool Dec 4, 2020
单机
|