惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
W
WeLiveSecurity
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
Google DeepMind News
Google DeepMind News
F
Full Disclosure
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Register - Security
The Register - Security
G
Google Developers Blog
C
Check Point Blog
GbyAI
GbyAI
A
About on SuperTechFans
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
T
Tor Project blog
AWS News Blog
AWS News Blog
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
MongoDB | Blog
MongoDB | Blog
Latest news
Latest news
aimingoo的专栏
aimingoo的专栏
U
Unit 42
Y
Y Combinator Blog
P
Privacy International News Feed
Cisco Talos Blog
Cisco Talos Blog
S
Securelist
S
Schneier on Security
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Attack and Defense Labs
Attack and Defense Labs
P
Proofpoint News Feed
C
Cisco Blogs
Webroot Blog
Webroot Blog
T
Troy Hunt's Blog
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
罗磊的独立博客
Cloudbric
Cloudbric
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog

MySQL

请教大家一个关于 mysql 服务崩溃的问题 - V2EX 数据库连接数超了如何解决 - V2EX count 的语句优化问题 - V2EX 连接 MySQL 很慢的问题 - V2EX MYSQL UPDATE 在很短的时间内更新相同的语句,就会有告警,导至事务失败,有没有人遇到这问题? MySQL 磁盘读取飙升,导致阿里云服务器卡死 - V2EX 求 Macos 下面 homebrew 安装 mysql 到指定目录的方法 使用 EXISTS 优化 IN 子查询 - V2EX 什么时候可以将 mysql 默认隔离机制改为读已提交 跨平台的 MySQL Parser - V2EX MySQL 大表排序有什么好的方案?只能上 Mongo? Mysql 无法修改自增主键的 AUTO_INCREMENT 值 升级服务器后, mysql 性能反而更慢了,求排查思路 《高性能 MySQL》第三版:是否已经过时? 坑爹的字符集问题:踩到了 MySQL 的 bug 两个人的数据开发团队,被要求从零开始治理企业数据 MySQL 8.4 LTS 与 Metabase 奇怪兼容性问题:降级到 8.0.4 后问题解决 (1Panel and BT Panel 复现) - V2EX 公司内网,怎么搭建主备 mysql,高可用。故障自动切。 不买云服务 mysql 自增 ID 突然变为 int 最大值问题 覆盖还原 data 文件夹后, mysql 无法启动了 - V2EX 生产力工具 - V2EX 各位大佬,有个奇葩的技术问题 - V2EX 关于 mysql trx_id 的疑惑 发帖一问 sql 性能讨论 - V2EX 有用过 SyncNavigator 或者类似的简单数据库同步软件吗, - V2EX mysql 遇到最愚蠢的查询性能问题,求解决 - V2EX 有什么优雅的 mysql 增加字段名的方法呢? - V2EX 各位 Mysql 大佬,问一个 8.0 版本 json 的问题 - V2EX mysql online DDL 时间很长,咋整,数据量不多,就 30W - V2EX 数据库中 select for update 和 version 乐观锁各自的适用场景是啥? - V2EX mysql 宿主机没有办法访问的问题 - V2EX mysql 求助 - V2EX MySQL 8.4 MGR 可以上生产吗? - V2EX mysql 亿级数据,数据筛选和导入导出 - V2EX 大佬们你们 Mysql 的数据库名称怎么分割的? - V2EX mysql 数据增量同步 - V2EX 新项目准备启动, MYSQL 选择 8.4.2 这个版本,有没什么坑? - V2EX mysql 一年新增 800 多万条数据,如果是单表的话请问服务器能支撑吗?各位有什么好的办法吗? - V2EX 新手求个远程数据库稳妥的解决方案~或者实时备份数据库的方法 - V2EX 铁子们,求助 docker 中 MySQL 导入数据库速度问题 - V2EX 大家的 SQL 一般怎么管理? - V2EX 询问一个慢查询的问题 - V2EX 现在用 mysql 的多 还是 mariadb 的多 - V2EX 关于 MySQL 查询咨询 - V2EX 请教个问题,如何快速的删除 mysql 的数据 求助:Mysql 数据文件夹如何被新安装的 Mysql 读取 - V2EX mysql 有没有什么中间件能模拟 mongodb? - V2EX 请问 debian12 mysql5.7 可以通过添加 apt 源安装吗?
数据库高频更新问题 谁遇到过没 有啥好的解决方案部 - V2EX
455035319 · 2025-02-06 · via MySQL

这是一个创建于 493 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

  • 更新
  • 卡顿
  • 死锁

    53 条回复    2025-02-08 14:01:37 +08:00

    iyiluo

    1

    iyiluo      2025 年 2 月 6 日

    放内存或者 redis ,定期写入数据库

    GPLer

    2

    GPLer      2025 年 2 月 6 日 via Android

    时序数据库或不可变数据库?反正用插入替代修改应该就能解决。

    mark2025

    3

    mark2025      2025 年 2 月 6 日   ❤️ 1

    1. 放内存或者 redis 。不过保持数据一致性需要额外开销
    2. 数据库存储用本地高速磁盘,比如 NVME
    3. 如果是 pgsql 数据库
    3.1 字段 FILLFACTOR 设定很小值(比如 1 )提高写入性能
    3.2 关闭 full page write 开关(需要磁盘磁层有相应的安全措施,比如 ZFS 文件系统)
    3.3 关闭 sync 同步写入(需要磁盘磁层有相应的安全措施,比如 UPS 、阵列卡电池)

    godall

    4

    godall      2025 年 2 月 6 日   ❤️ 2

    我建议是修改业务逻辑,标准的读写分离:
    1 、update 改为 insert ,插入数据同时更新 redis 。
    2 、增加 redis ,提供读服务

    这样不会有问题,即使突然挂了,数据还在数据库里,重启初始化 redis 就行了。

    21231sv

    6

    21231sv      2025 年 2 月 6 日   ❤️ 1

    有没有大佬解释下为什么 1 秒更新上百次就会卡顿死锁

    coderzhangsan

    7

    coderzhangsan      2025 年 2 月 6 日

    现在的问题是数据库更新并发太高,数据库负载扛不住;楼上已经给出了问题相关解决方案,我抛砖引玉总结下楼上解决方案思路。

    1. 从降低并发负载角度来看,常规是采取削锋,控制数据库并发流量,例如可以使用消息队列处理,控制好消费流量即可。
    2.从提高并发负载角度来看,使用内存缓存替代传统关系型数据库或内存缓存作为中间层.
    3.从提高数据库行锁并发角度来看,业务策略调整,用写入替代更新,数据量会飙升,后续是否考虑分表或者定时清理数据。
    4. 提升机器配置。

    CEBBCAT

    8

    CEBBCAT      2025 年 2 月 6 日

    可不可以请假下是什么业务场景,怎么压力都堆到 DB 来了?

    CEBBCAT

    11

    CEBBCAT      2025 年 2 月 6 日

    @455035319 #10 购票系统,单行,RPS 数百,类型为金额,这是动态定价吗家人😂

    但价格频繁变动,用户需要支付的金额也会变化,这场景太抓马了

    skallz

    12

    skallz      2025 年 2 月 6 日

    @CEBBCAT 确实没见过这种,这种高频数据写入场景只在物联网中遇见过,用的也是时序数据库。。。

    freemoon

    13

    freemoon      2025 年 2 月 6 日

    这不跟交易系统一样了,已经不适合用 mysql 实时存储了,都是放内存数据库,再延时落地 mysql 。

    vveexx

    15

    vveexx      2025 年 2 月 6 日

    楼上大佬给的方案已经足够多,但是刚又想到一种。如果价格是可预知的,提前生成出来所有可能的值应该也能解决。具体的最好能把场景贴的太详细一点

    qyvlik

    16

    qyvlik      2025 年 2 月 6 日

    热点账号的问题。
    rds 范畴内: 分散更新,合并读取;追加记录,合并更新;如下:
    1. 多个账户,增加资金时哪个空闲用哪个;扣除资金如果不够,还是要锁全部账户。
    2. insert 记录,作为待结算数据,然后再批次更新回主记录。

    非 rds 范畴:
    1. 不考虑用 rds 了,上 redis 等非关系数据库。
    2. 如果怕 redis 丢数据,用 in-memory + kafka ,in-memory 就是直接 java ( rust 也许更快)内存维护最新状态(本地内存可比 redis 快多了),kafka 记录变动流水( kafka 容量可比 redis 大多了)。

    pony2335

    18

    pony2335      2025 年 2 月 6 日

    @lasuar 写内存不好保持一致性吧。 如果内存突然挂了,交易丢失是很严重的事故。 不是很懂,望讨论。

    justseemore

    19

    justseemore      2025 年 2 月 6 日

    可以维护一个 token 池子 这个池子的 token 可以一次性生成, 可以随时补充, 每个 token 对应一个价格, 然后预扣, 最后统计池子中没用的 token 余额加回就好了..

    freemoon

    20

    freemoon      2025 年 2 月 6 日   ❤️ 1

    @pony2335 #18 既然是写内存,那这种数据肯定是允许丢失的,比如 1s 中变化上百次的字段,丢失其中第 99 次的数据并不影响什么,因为系统恢复后,马上又会收到最新的数据。
    如果发生交易,那交易记录是从内存中获取实时价格,然后记录本身要入持久化数据库的(而不是写内存)。

    A5SqQoWI1DOXm7Y7

    21

    A5SqQoWI1DOXm7Y7      2025 年 2 月 6 日   ❤️ 3

    设计的就有问题,为啥都要并发修改在数据库层面,正常不是缓存层面加锁控制数量金额等,业务交互在数据库之前走完了,数据库只是记录最终结果。然后再改数据库,而不是直接操作数据库,任何性能问题都是架构层面的问题,不是改个啥代码能解决的,除非屎山代码

    nicoley

    22

    nicoley      2025 年 2 月 6 日

    @miaomiaotu Redis 不是单线程执行的吗,为什么要在缓存层面加锁控制?如果确实要做业务流程编排,感觉可以把这部分的控制放到 Lua 脚本里面去控制。

    nicoley

    23

    nicoley      2025 年 2 月 6 日

    @miaomiaotu 再就是 Redis 和 数据库数据的一致性该如何保证咧 ? 就是存在 Redis 挂了的情况?

    mark2025

    25

    mark2025      2025 年 2 月 6 日

    @godall 更新改为插入新记录无法解决并发写入的一致性问题吧:UPDATE SET val+10 ,这个 val 怎么确保是最新记录呢?

    silentsky

    27

    silentsky      2025 年 2 月 6 日

    用 hazelcast 或 redis

    guanhui07

    28

    guanhui07      2025 年 2 月 6 日

    用 redis 然后 定期刷入 db

    zmal

    31

    zmal      2025 年 2 月 6 日   ❤️ 1

    把你的问题拿去问 deepseek R1 , 给的答案比评论区大部分方案靠谱。

    v2er119

    32

    v2er119      2025 年 2 月 6 日

    同一个字段没关系,不是同一行的就没问题,降低锁的粒,表到行到页。前提能准确定位,又不产生共享锁。

    linora

    33

    linora      2025 年 2 月 6 日

    业务场景描述太过有限

    说白了就是避免行锁,那只能参考数据库的 latch 和 children latch 设计

    即将一行尽量拆分成多行

    比如 100 块资源池,拆分成 4 行,每行 25 块

    不考虑 delete/insert 的话,纯 update 随机一行

    如果只是一味的累加,风险不大

    否则可能遭遇负数风险,就要引入全局锁定读

    所以还得看场景!看场景!看场景!

    areless

    34

    areless      2025 年 2 月 6 日 via Android

    肯定是股票~期货~外汇~数字货币呗,报价随买卖单对挂单的撮合而动,mysql 做不到的,直接用缓存之类的放内存里面。

    Asheet

    35

    Asheet      2025 年 2 月 6 日

    将多次 update 的行锁请求合并到一次上。比如启动一个异步线程和引入一个时间窗口,对这个窗口内的所有请求扣减金额进行相加,进行一次 update 。然后进行多次 insert 操作记录扣减日志,发生异常根据日志情况进行回滚

    nicoley

    36

    nicoley      2025 年 2 月 6 日

    @Asheet 如果合并请求后预计总共扣减的金额和超过了表里面这个字段上的值,那该怎么处理

    realpg

    38

    realpg      2025 年 2 月 6 日

    换一个技术牛逼点的架构师

    xyooyx

    39

    xyooyx      2025 年 2 月 7 日

    @mark2025 #25 楼主想表达的可能是引入“账单”概念,以此把并发 update 写转化为并发 insert ,从根源上规避了高并发操作同一行的场景,计算余额对所有操作行做累加即可

    nicoley

    41

    nicoley      2025 年 2 月 7 日

    要是设计表的时候,主键字段设置的是数据库自增,那还能提升写入的并发吗

    sagaxu

    42

    sagaxu      2025 年 2 月 7 日

    确定有死锁,那就排查一下死锁原因,正常情况每秒几百次的单行 update 是吃得消的

    hd7771

    44

    hd7771      2025 年 2 月 7 日

    AliSQL 这个源码不建议用了,没人维护的,一定要用,可以用 PolarDB-X Engine 这个代码,我走的时候还有团队在负责。

    A5SqQoWI1DOXm7Y7

    45

    A5SqQoWI1DOXm7Y7      2025 年 2 月 7 日

    @nicoley 加分布式锁,先改缓存,缓存成功再改数据库,一致性保证就行,查询什么的走缓存,然后数据库做主主复制或者主从,再加读写分离,这样方案扩展性强,前提是技术到位再加上服务器到位,完美方案,最主要的是把数据库的读压力和写压力分开,数据库在并发读时候出现锁表问题很低,但是加上并发写就会出现,所以最终目的还是数据库读写分离加上压力在缓存层解决,完美,服务器要给力,不然是累赘这个方案

    A5SqQoWI1DOXm7Y7

    46

    A5SqQoWI1DOXm7Y7      2025 年 2 月 7 日

    @nicoley 如果架构层次解决不了,只能改业务代码那块,那么就使用乐观锁机制,把事务内部代码减少,尽量一个事务内就是单独修改哪个金额数字,减少事务时间,再加上修改时候尽量走索引这样行锁,避免锁表,这样也可以,但是都是拆东墙补西墙方案,不是最终的,最终的还是之前架构方案

    whahugao

    48

    whahugao      2025 年 2 月 7 日

    问题本质是热点数据写

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

    另一种思路是在数据库层面进行合并提交,类似 43 楼的的做法,需要魔改 MySQL 。热点行更新能抗几百一两千并发问题不大。

    areless

    49

    areless      2025 年 2 月 7 日

    1 秒上百次的写,肯定也得 1 秒上百次读出来,纯 update 写本身毫无意义的。纯数据库方案即便各种方式写进去了,也是读不出来。比如 1 2 3 4 5 6 7 ,读出来就可能是 1 1 1 6 6 。读写都不落数据库是最好的方案,然后再搞个消息队列往数据库里塞海量的价格变动日志,供离线分析。

    xmdbb

    50

    xmdbb      2025 年 2 月 7 日   ❤️ 1

    @CEBBCAT 感觉是和景区对接,并不是单行过百,而是该字段更新频率过百。国内这个体系的盲猜长隆集团对接

    MoYi123

    51

    MoYi123      2025 年 2 月 7 日

    只是高频更新不会导致死锁, 建议先把死锁的问题修好再看.