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

2018 年 5 月 23 日
 mmnnyycc

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

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

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

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

https://v2ex.xtra.eu.org/t/457233

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

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

© 2021 V2EX