数据库高频更新问题 谁遇到过没 有啥好的解决方案部

7 天前
 455035319

一个字段金额,一秒可能要更新上百次,就会卡顿死锁,应该怎么处理比较好

3926 次点击
所在节点    MySQL
53 条回复
nicoley
6 天前
要是设计表的时候,主键字段设置的是数据库自增,那还能提升写入的并发吗
sagaxu
6 天前
确定有死锁,那就排查一下死锁原因,正常情况每秒几百次的单行 update 是吃得消的
hd7771
6 天前
我之前在阿里做过 MySQL 内核,这种场景阿里是通过修改 MySQL 源码解决的。具体原理其实就是在 MySQL Server 层排队批量提交多个事务,InnoDB 只用拿一次行锁,提交成功之后在 Server 层构造结果。
https://github.com/alibaba/AliSQL/wiki/AliSQL-Performance-benchmark-for-inventory
hd7771
6 天前
AliSQL 这个源码不建议用了,没人维护的,一定要用,可以用 PolarDB-X Engine 这个代码,我走的时候还有团队在负责。
miaomiaotu
6 天前
@nicoley 加分布式锁,先改缓存,缓存成功再改数据库,一致性保证就行,查询什么的走缓存,然后数据库做主主复制或者主从,再加读写分离,这样方案扩展性强,前提是技术到位再加上服务器到位,完美方案,最主要的是把数据库的读压力和写压力分开,数据库在并发读时候出现锁表问题很低,但是加上并发写就会出现,所以最终目的还是数据库读写分离加上压力在缓存层解决,完美,服务器要给力,不然是累赘这个方案
miaomiaotu
6 天前
@nicoley 如果架构层次解决不了,只能改业务代码那块,那么就使用乐观锁机制,把事务内部代码减少,尽量一个事务内就是单独修改哪个金额数字,减少事务时间,再加上修改时候尽量走索引这样行锁,避免锁表,这样也可以,但是都是拆东墙补西墙方案,不是最终的,最终的还是之前架构方案
junwind
6 天前
@21231sv 数据库 io 瓶颈
whahuzhihao
6 天前
问题本质是热点数据写

一种思路是改用 redis 这种能抗热点修改的组件,异步落盘到 DB 。但是针对金额这种敏感字段,不建议这么做,除了需要额外维护一致性,还需要将所有读数据的场景都迁移到 redis 。

另一种思路是在数据库层面进行合并提交,类似 43 楼的的做法,需要魔改 MySQL 。热点行更新能抗几百一两千并发问题不大。
areless
6 天前
1 秒上百次的写,肯定也得 1 秒上百次读出来,纯 update 写本身毫无意义的。纯数据库方案即便各种方式写进去了,也是读不出来。比如 1 2 3 4 5 6 7 ,读出来就可能是 1 1 1 6 6 。读写都不落数据库是最好的方案,然后再搞个消息队列往数据库里塞海量的价格变动日志,供离线分析。
xmdbb
6 天前
@CEBBCAT 感觉是和景区对接,并不是单行过百,而是该字段更新频率过百。国内这个体系的盲猜长隆集团对接
MoYi123
6 天前
只是高频更新不会导致死锁, 建议先把死锁的问题修好再看.
mark2025
5 天前
@hd7771 mysql 修改源码源码上限也有限,如果是 pgsql 可以考虑用咨询锁( advisor lock )来降低锁开销
https://developer.aliyun.com/article/64351
https://www.modb.pro/db/48169
mark2025
5 天前
@lqw3030 不过如果需求是要即时读那就不满足了……

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

https://tanronggui.xyz/t/1109295

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

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

© 2021 V2EX