mysql 将 update 后的结果查询出来?

2018-05-23 18:16:08 +08:00
 mmnnyycc

1.先 update 表将某个字段加 1 2.将这个字段查询出来

并发大的时候会出问题,求怎么合并?

5020 次点击
所在节点    程序员
18 条回复
FrailLove
2018-05-23 18:31:05 +08:00
update 后可以带 return 子句
startar
2018-05-23 18:33:13 +08:00
@FrailLove mysql 好像不行吧
sujin190
2018-05-23 18:44:15 +08:00
事务没调好?单机的怎么会有问题!
Raymon111111
2018-05-23 18:50:53 +08:00
直接把尝试更新的值 + 1 当成数据库最新的值就好了.
opengps
2018-05-23 18:52:56 +08:00
查询时候执行加一不行吗?
karllynn
2018-05-23 19:51:24 +08:00
直接加一不就完了。。不行你就用悲观锁吧
widdy
2018-05-23 19:56:28 +08:00
这个是 update 并发大的问题,并不是 update 之后查询的问题!
sampeng
2018-05-23 20:05:59 +08:00
这种 id。可以在 redis 里面操作,然后定时+定量写回去。允许一定误差。不允许误差就再加其他保护呗,比如消息队列之类的。
大并发不加锁是肯定不行的,可能一开始 1.一堆人得到结果是 2
wweir
2018-05-24 06:50:47 +08:00
默认的隔离级别,不能保证高并发的写的同时,读出来的值刚好是当前值,但保证最终的结果正确还是很轻松的。顶多执行会慢一点,show processlist 看到不少线程 hang 在锁上
ebingtel
2018-05-24 09:13:50 +08:00
我觉得应该反过来:1. 将这个字段查询出来 记为 A 2. update 表将某个字段加 1 3. 如果 update sql 的 affected rows>0, 那么 return A+1; 否则,继续查询、update ……
randyzhao
2018-05-24 09:48:36 +08:00
@ebingtel
你这个做法,1 和 2 之间有另一个用户正好也操作到第 2 步怎么办 2333
PerFectTime
2018-05-24 10:06:14 +08:00
@ebingtel #10 高并发不就 GG 了
sun1991
2018-05-24 10:59:35 +08:00
不明白, MySql InnoDB 默认事物隔离级别不是 repeatable-read 吗, 把 1 和 2 放在一个事物里, 返回结果应该不会出错呀?
ebingtel
2018-05-24 16:14:34 +08:00
@randyzhao @randyzhao 使用条件更新 UPDATE ... WHERE XX = A
randyzhao
2018-05-25 09:32:31 +08:00
@ebingtel 那不就是有可能更新不成功咯?
ebingtel
2018-05-25 10:51:53 +08:00
@randyzhao 所以需要判断返回的 affected_rows 啊
randyzhao
2018-05-25 14:42:06 +08:00
@ebingtel 这一顿操作猛如虎。。。然后更新失败了。。。
ebingtel
2018-05-26 10:32:18 +08:00
@randyzhao 没有吧……我自己的项目,多机多进程,使用条件更新+重试机制,跑起来正常啊,主要是为了避免业务层面的分布式锁而已

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

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

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

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

© 2021 V2EX