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