什么是事务(transaction)
一个事务是由一组操作构成。一般我们希望组成事务的所有操作都能够正确执行,但是如果其中任一操作执行失败,那么该事务已经正确执行操作将全部回滚。简单地说,事务提供一种“要么什么都不做,要么做全套(All or Nothing)”机制。
事务的四大特性:ACID
原子性/不可分割性(atomicity)
一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。例如,A通过银行系统给B转账100元,这个过程要分成两个操作,从A的账号扣款,往B的账户打款。要么都成功:A的账户少了100,且B的账户多了100;要么都失败:A、B账户的钱都没变。
一致性(Consistency)
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。还是上面的例子,不管是A给转账B成功,还是不成功,结果都应该符合预期:A减少的资金额等于B增加的资金额。
隔离性/独立性(Isolation)
数据库允许多个并发事务同时对其数据进行读写和修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性(Durability)
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
什么是分布式事务?
在后端微服务架构普及的情况下,一个大型系统必定有多个子系统组成,这些子系统一般会拥有各自独立的数据库。往往一个业务流程需要由多个子系统共同完成,而且这些操作可能需要在一个事务中完成。在微服务系统中,这些业务场景是普遍存在的。对于发生在不同系统上的一组操作,我们要通过某种机制保证它们要么全部正确执行,要么全部都不执行,这种机制就是“分布式事务”。
分布式事务的基础
CAP定理
CAP定理,又被叫作布鲁尔定理,它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
一致性(Consistency)
同一个数据的多个副本是否实时相同。从客户端角度来说就是读操作返回最新写入的值。
可用性(Availability)
每次请求都能在合理的时间内获取到非错的响应(而不是错误和超时响应),但是不保证获取的数据为最新数据。
分区容错性(Partition tolerance)
将同一个服务部署在多个系统中,从而保证某个系统宕机,其他系统依然能够提供相同的服务。
CAP定理告诉我们C、A、P三者不能同时满足,只能同时满足其中两个。实际上由于互联网不能保证网络100%可靠,所以P时必须得满足的,因此要么满足C和P,要么满足A和P。
对于CP来说,放弃可用性,追求一致性和分区容错性,zookeeper就是追求的强一致。
对于AP来说,放弃强一致性(所有分布式系统都至少保证弱一致性),追求分区容错性和可用性,这是很多分布式系统设计时的选择,后面的BASE也是根据AP来扩展。
BASE理论
BASE理论是根据CAP理论的AP扩展而来,它包含以下三点:
基本可用(Basically Available)
系统能够基本运行、一直提供服务。分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。
软状态(Soft-state)
系统不要求一直保持强一致状态。
最终一致性(Eventual consistency)
经过一段时间后,所有节点数据都将会达到一致。
注:acid为“酸”的英文名称,base为“碱”的英文名称。