线程安全:多个线程之间的切换不会导致该接口的执行结果存在二义性。
分布式一致性:数据的多份副本,当对一个副本进行修改时,其它的副本的值也要与其保持一致。
数据库一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。保证数据库一致性是指当事务完成时,必须使所有数据都具有一致的状态。
线程不完全则分布式一致性是绝对无法保证的。线程安全,也不一定可以保证分布式一致性。所以分布式一致性是一种更复杂的要求。
线程不安全则数据库的一致性绝对无法保证。数据库的一致性其实就是数据库本身的线程安全性吗?
隔离级别:
串行:没有线程安全问题,数据变更依赖的状态是事务开始的状态。
RR: 并发执行,存在线程安全问题,数据变更依赖的状态是事务开始的状态,不会受到其他事务的影响。但是对新增数据无能为力。
RC: 并发执行,存在线程安全问题,数据变更依赖的状态是会受其他事务影响的。
Read not commit: 并发执行,存在线程安全问题,数据变更依赖的状态是会受其他事务影响的。
所以,事务最多只是提供了线程安全,一定的数据隔离,还有原子性。这些无法保证可以达到分布式的数据一致性。
在考虑应用的数据一致性的时候,需要额外考虑达到目标的手段。
分布式一致性的挑战:
1. 分布性:数据/机器的空间分布。
2. 对等性:没有主从之分
3.并发性:线程安全
4.缺乏全局时钟:无法根据统一的时间标准来判断哪个操作先发生。
5.网络通信的不稳定性。
分布式一致性是非常复杂的,解决方案根据不同的场景往往也不一样:
1.队列,把key打散,横向扩容。单个队列顺序消费
2.全量数据的append写入+timestamp
3.分布式锁(redis,mysql)
4.version-id+CAS
5. mysql + 唯一键
唯一约束真的有必要在物理层做强约束吗? 单单在逻辑层的保证靠谱吗?