1.先 update 表将某个字段加 1 2.将这个字段查询出来
并发大的时候会出问题,求怎么合并?
1
FrailLove 2018-05-23 18:31:05 +08:00
update 后可以带 return 子句
|
3
sujin190 2018-05-23 18:44:15 +08:00
事务没调好?单机的怎么会有问题!
|
4
Raymon111111 2018-05-23 18:50:53 +08:00
直接把尝试更新的值 + 1 当成数据库最新的值就好了.
|
5
opengps 2018-05-23 18:52:56 +08:00 via Android
查询时候执行加一不行吗?
|
6
karllynn 2018-05-23 19:51:24 +08:00
直接加一不就完了。。不行你就用悲观锁吧
|
7
widdy 2018-05-23 19:56:28 +08:00
这个是 update 并发大的问题,并不是 update 之后查询的问题!
|
8
sampeng 2018-05-23 20:05:59 +08:00
这种 id。可以在 redis 里面操作,然后定时+定量写回去。允许一定误差。不允许误差就再加其他保护呗,比如消息队列之类的。
大并发不加锁是肯定不行的,可能一开始 1.一堆人得到结果是 2 |
9
wweir 2018-05-24 06:50:47 +08:00 via Android
默认的隔离级别,不能保证高并发的写的同时,读出来的值刚好是当前值,但保证最终的结果正确还是很轻松的。顶多执行会慢一点,show processlist 看到不少线程 hang 在锁上
|
10
ebingtel 2018-05-24 09:13:50 +08:00
我觉得应该反过来:1. 将这个字段查询出来 记为 A 2. update 表将某个字段加 1 3. 如果 update sql 的 affected rows>0, 那么 return A+1; 否则,继续查询、update ……
|
12
PerFectTime 2018-05-24 10:06:14 +08:00
@ebingtel #10 高并发不就 GG 了
|
13
sun1991 2018-05-24 10:59:35 +08:00
不明白, MySql InnoDB 默认事物隔离级别不是 repeatable-read 吗, 把 1 和 2 放在一个事物里, 返回结果应该不会出错呀?
|