You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Galera多主复制中指定条件UPDATE语句的原子性保障问询

在Galera多主复制场景下,带条件的UPDATE是否保证原子性?

答案是能保证——当两个客户端针对同一primary_key和old_value发起这条UPDATE请求时,最终只会有一个更新成功生效。

核心原因:

  1. 底层存储引擎的事务支持
    这条SQL依赖InnoDB(Galera默认搭配的事务引擎)的行级锁和MVCC机制:在单节点内,并发执行这条UPDATE时,InnoDB会为目标行加排他锁,只有第一个拿到锁的事务能完成更新;其他事务等待锁释放后,检查col = old_value时会发现条件不满足,返回影响行数0。

  2. Galera的认证复制机制
    在多主场景下,Galera采用认证复制(Certification-Based Replication):

    • 每个写事务先在本地节点执行,生成包含行修改信息的「写集」
    • 写集会同步到集群所有节点,集群会对写集做冲突校验:如果两个事务修改同一行,且其中一个已经完成认证提交,另一个事务的写集就会被判定为冲突,触发事务回滚
    • 哪怕两个请求分别在不同节点发起,最终也只有一个能通过集群认证完成持久化,另一个会因为冲突失败,不会修改数据。

注意事项

  • 必须使用事务型存储引擎(如InnoDB),如果是MyISAM这类非事务引擎,不管是否用Galera,都无法保证原子性和并发一致性。
  • 冲突发生时,客户端会收到影响行数为0的结果(或根据配置返回报错),需要在业务代码里处理这种情况。

内容的提问来源于stack exchange,提问作者Kevin G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:55:39