image-20220517141356497

分布式事务又分为强事务和柔性事务(最终一致性)

  • 强事务:基于XA实现,如2PC,3PC
  • 柔性事务:TCC,最大努力通知(如消息队列的本地事务消息表)

# 一、两阶段提交(2PC)

  • prepare阶段:锁定资源(执行本地数据脚本但不提交事务)
  • commit阶段:提交资源(根据第一阶段的返回结果,确定rollback还是commit)

image-20220517131004403

缺点:

  • 性能(同步阻塞):发送prepare后,如果部分参与者断开连接,会导致其他参与者的资源处于被动阻塞状态。
  • 数据一致性(网络抖动):发送commit后,如果出现网络抖动,导致部分服务未接收到commit,则整个分布式系统会出现数据不一致的情况。
  • 可靠性(单点故障):发送prepare后,如果协调者宕机并重新选举,选举后的协调者无法解决上个事务问题,导致参与者资源一直阻塞。

# 二、三阶段提交(3PC)

3PC本质上是对2PC的优化,加入了一个precommit阶段,同时引入了超时机制,当参与者各种原因未收到协调者的commit请求后,会对本地事务进行commit,不会一直阻塞等待,解决了2PC的单点故障问题,通过ack超时重试机制,保证commit最终被提交,确实数据的一致性。

  • CanCommit:保证网络正常,确保资源满足要求。
  • PreCommit:执行数据库脚本,锁定资源,不提交事务。如果在锁定资源后等待DoCommit超时,则自动提交(根据概率计算而来),防止资源被无限锁定。
  • DoCommit:根据PreCommit的结果,确定是commit还是rollback。

image-20220517132549216

缺点:

  • 增加一个步骤,参与者和协调者通信次数增加。增加了系统的复杂度。

优点:

  • 增加询问功能【减缓阻塞】,在锁定资源前发现问题,减少阻塞时间。
  • 自动提交功能【解决数据一致性问题】,在等待DoCommit超时后,自动提交事务(根据概率计算得来),防止资源被无限阻塞。

# 三、补偿事务(TCC)

【柔性事务】

TCC的实现逻辑跟2PC类似,只不过2PC应用于DB层,TCC则可以理解为在应用层的2PC,是需要我们编写业务逻辑来实现的方式。

TCC的数据一致性上是最终一致性,因为其会预扣资源并提供补偿机制,即使事务最终执行失败,在这个过程中,其他事务看到的数据库都是被扣除后的数据。

  • Try:完成业务检查,预留业务所需的资源。Try是整个TCC的精髓,可以灵活选择业务资源锁的粒度。
  • Confirm:执行业务逻辑,直接使用Try操作预留的业务资源,无需再次检查。
  • Cancel:释放Try阶段预留的业务资源。

image-20220905001340219

缺点:

  • 业务侵入性强,需要实现Try、Confirm、Cancel接口,并在业务初始化阶段将这三个接口的实现注入TCC事务管理器。

优点:

  • 可以在Try阶段控制锁的粒度,只预留资源,而不是真正的操作。比如用XA,则在事物执行期间,相关数据会在数据库层面被锁定,导致其他事物无法操作。而TCC则不会,他在页面层面加锁,先预扣相关资源(Try),并提供错误补偿机制(Cancel),即使该TCC还在执行,也不阻塞其他TCC操作。

参考:

Last Updated: 2022-11-23 2:09:07 ├F10: PM┤