我们常用的事务是数据库事务,在单机单应用单数据库场景下才适用的,随着分布式系统越来越普及,数据的一致性问题如何解决,业界目前主要有3种解决方案:
一、两阶段提交。
第一阶段,所有事务参与者将执行结果的成功与否反馈给事务协调者,但是不提交。
第二阶段,事务协调者根据返回的结果,决定是全部提交,还是全部不提交。
该方案可以保证事务的4个特性ACID。
A原子性,一个事务内的操作要么全部成功,要么全部失败。
C一致性,事务提交后,数据必须满足完整性约束。
I隔离性,事务间的操作是独立的,互不影响。
D持久性,事务提交后,数据永久生效。
该方案不足之处,可能子事务B在执行时,要访问还未提交事务的子事务A锁定的资源,导致锁等待,吞吐量会遇到瓶颈,导致性能不高。
二、TCC
TCC是两阶段提交的一个变种,在事务的ACID和性能间找到一个平衡点,部分牺牲一致性和隔离性,保证事务最终的一致性。
T,也就是Try,它会执行完所有的操作,并提交(准确说是临时提交),不会导致锁等待。
C,也就是Confirm,如果Try操作全部成功ÿ