面试题答案
一键面试检测数据冲突方法
- 基于唯一约束检测:
- 在表上设置唯一索引或主键约束。当两个主节点同时对相同数据进行修改并尝试插入违反唯一约束的数据时,MySQL会抛出错误,从而检测到冲突。例如,若有一个
users
表,对email
字段设置了唯一索引,当两个主节点同时插入具有相同email
的用户记录时,就会触发唯一约束冲突。
- 在表上设置唯一索引或主键约束。当两个主节点同时对相同数据进行修改并尝试插入违反唯一约束的数据时,MySQL会抛出错误,从而检测到冲突。例如,若有一个
- 时间戳或版本号检测:
- 在表中添加一个时间戳(
TIMESTAMP
)字段或版本号(通常为自增整数)字段。每次数据更新时,该字段值都会更新。当一个主节点尝试更新数据时,会先检查当前记录的时间戳或版本号与自己上次读取的是否一致。若不一致,说明另一个主节点已更新过该数据,从而检测到冲突。例如,有一个products
表,包含version
字段,主节点A读取某产品记录时version
为1,在A准备更新该记录时,若发现version
已变为2(说明主节点B已更新过),则检测到冲突。
- 在表中添加一个时间戳(
- MD5 或哈希值检测:
- 对要修改的数据计算MD5值或其他哈希值。在更新数据前,再次计算哈希值并与之前保存的哈希值比较。如果哈希值不同,说明数据已被其他主节点修改,检测到冲突。例如,对于一个文本字段
description
,主节点在读取时计算其MD5值,在更新前再次计算,若MD5值变化,表明数据冲突。
- 对要修改的数据计算MD5值或其他哈希值。在更新数据前,再次计算哈希值并与之前保存的哈希值比较。如果哈希值不同,说明数据已被其他主节点修改,检测到冲突。例如,对于一个文本字段
处理数据冲突方法
- 手动干预:
- 当检测到冲突后,系统可以暂停相关操作,并通知管理员。管理员根据业务逻辑,人工判断哪个主节点的修改是正确的,然后手动处理数据,使其保持一致。例如,在订单系统中,两个主节点同时修改了订单状态,管理员根据实际业务情况确定正确的订单状态并进行调整。
- 基于规则自动处理:
- 以时间戳为准:根据时间戳字段,选择时间戳更新较晚的修改作为有效修改。例如,主节点A在10:00更新数据,主节点B在10:01更新数据,以主节点B的修改为准,覆盖主节点A的修改。
- 以特定主节点为准:预先设定一个“优先主节点”。当发生冲突时,无论哪个主节点先修改,都以优先主节点的修改为准。例如,在多数据中心的主 - 主复制场景中,设定数据中心1的主节点为优先主节点,若与其他主节点发生冲突,以数据中心1主节点的修改为准。
- 合并修改:
- 如果修改的是不同字段,可以将两个主节点的修改合并。例如,一个主节点修改了
user
表中用户的name
字段,另一个主节点修改了age
字段,系统可以将这两个修改合并到同一条记录上。但这种方法需要确保合并后的结果符合业务逻辑。
- 如果修改的是不同字段,可以将两个主节点的修改合并。例如,一个主节点修改了