背景:
两人可以更新同一条数据,如站长与副站长都要更改站点联系电话,最终后更改的把之前更改的数据覆盖。
如何保证数据一致性?How
1 悲观方式:避免发生冲突,
采用写入锁,锁系统保证同一时刻只有同一用户执行写操作。
2 乐观方式:先让冲突发生,检测冲突并对发生冲突的操作排序。
采用条件更新,任意用户执行更新操作之前都要测试数据的当前值与上次读入的值是否相同。
悲观锁分析:
非对等复制环境中,锁master节点对应数据即可。
对等复制环境中,需要锁所有节点对应数据,死锁风险增大。
乐观锁分析:
非对等复制环境,版本号比较更新即可
对等复制环境,前n个节点比较更新成功,第n+1个节点失败,前n个需要回滚,复杂性高,数据一致性难以维护
乐观所实现:多版本控制,如MySQL每个事物对应一个版本,可重复读的实现就是读历史版本而非最新版本解决
选择乐观锁 还是 悲观所?
1 数据安全性
2 响应能力
3 死锁
悲观方式 能解决1 但2差 大概率导致3
分布式模型选择:
不同节点有同一数据的拷贝,各个节点可能会以各自独立的顺序更新该数据,导致该数据在节点间不一致。
解决:针对某份数据的所有写操作都交给一个节点完成,其他节点对该份数据处理顺序依赖于主节点处理顺序。
除了对等复制外,其余模型都实现了上述解决方案。