原子性 (Acomicity)

事物要么完全成功并提交,要么根本不执行。

示例:A转账给B 100元,最后要么A账号少了100元、B账号增加了100元,要么转账失败,A和B账户都没有变化。而不应该出现A账户减少了100元,但B账户没有变化;或者A账户没有变化,但B账户增加了100元的情况。

一致性 (Consistency)

熟悉数据库的朋友都知道,数据库的一致性包括:

  • 所有的主键值都是唯一的;
  • 数据库具有引用完整性,即记录只记录存在的对象;
  • 某些数据只能处于特定的范围(比如年龄小于150)

这里的事务一致性表示:对数据库单独执行事务的时候,如果数据库之前是一致的,执行完了之后也应该是一致的。

这里需要强调的是:和原子性、隔离性和持久性不通,一致性需要由事务程序和执行这些事务程序的TP系统共同负责。

隔离性(Isolation)

如果一个系统运行一个事务集的效果与系统一次运行其中的一个事务的效果相同,那么就说这个事务集是可隔离(可串行的serializable)。

举例:两个事物A、B同时从一个银行账户取最后100元,如果能保证A、B一起执行的效果核A先B后或A后B先的效果一样,就说这类事物是可串行的。

持久性(Durability)

持久性是指当事物执行完毕,所有的更新都存储在稳定的存储器上,不受电源故障或操作系统对影响。之所以需要这样,是因为每个事物都会向用户提供服务,相当于用户核提供服务的企业直接的合同。

举例:A向B转账100元完成之后,A的账户会少100元,B的账户多100元,这个信息需要持久化到非易失性存储器上,以保证不会随着系统重启、异常掉电而丢失记录。

两阶段提交

如果一个事物中,设计多需要对多个数据(数据库)的处理,通常需要用到两阶段提交:

分布式事物的特性

一致性

分布式系统为了 高可用性,总是不可避免的使用副本的机制,从而引发副本一致性的问题。 根据具体的业务需求的不同,分布式系统总是 供某种一致性模型,并基于此模型 供具体的服务。越是强的一致的性模型,对于用户使用来说使用起来越简单。例如通常我们总 是希望某次更新后可以立刻读到最新的修改,如果成功更新后的数据依旧有可能不一致读到旧数据, 那么用户就需要在写入数据时加入序列号等信息,并在读取数据时首先自行实现过滤去重后再使用 数据。

可用性

系统的可用性(availability)指系统在面对各种异常时可以正确 供服务的能力。系统的可用性可 以用系统停服务的时间与正常服务的时间的比例来衡量,也可以用某功能的失败次数与成功次数的 比例来衡量。可用性是分布式的重要指标,衡量了系统的鲁棒性,是系统容错能力的体现。

分区容忍性

指系统可以对网络分区这种异常情 况进行容错处理;

CAP 理论

该理论指出:无法设计一种分布式协议,使得同时完全具备 CAP 三个属性,即:

  • 该种协议 下的副本始终是强一致性;
  • 服务始终是可用的
  • 协议可以容忍任何网络分区异常;

分布式系统 协议只能在 CAP 这三者间所有折中。
CAP 理论的详细证明可以参考相关论文。这里可以简单用一个反例证明不存在 CAP 兼具的系 统。假设系统只有两个副本 A 和 B,Client 更新这两个副本,假设在网络分化时,Client 与副本 A 可以正常通信,但副本 B 与 Client、副本 B 与副本 A 无法通信,此时,Client 对副本 A 更新的信息 永远无法同步到副本 B 上。如果希望系统依旧具有强一致的属性,则此时需要停止更新服务,即不 再修改数据,从而让副本 A 与副本 B 保持一致;如果希望系统依旧可以 供更新服务,则只能更新 副本 A 而无法更新副本 B,此时无法保证副本 A 与副本 B 一致。