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