-
常见理论
- 两阶段提交协议(2pc):分为两个阶段,即准备阶段和提交阶段。准备阶段,协调者向所有参与者发送事务请求,参与者执行事务但不提交,然后回复是否可以提交。提交阶段,如果所有参与者都回复可以提交,协调者发送提交指令,参与者正式提交事务;否则协调者发送回滚指令,参与者回滚事务。
- 三阶段提交协议(3pc):在两阶段之前加了一个canCommit阶段,保证协调者和参与者的有效性,避免资源浪费;完善了各阶段的超时情况的处理;
- base理论:基本可用,软状态,最终一致性,即可存在中间态,例如,事务由两个本地事务组成,一个成功了,另一个处理中,则整体状态为处理中状态,经过一段时间后另一个事务为已完成,则整体事务为已完成。
-
常见的模式
模式 | 特点 | 适用场景 | 理论 |
---|---|---|---|
XA | 需要数据库支持;准备阶段完成后阻塞;玩整的实现了事务特性 | 事务中对多个数据源进行操作 | 2pc |
AT | 不需要数据库支持;准备阶段完成时提交本地事务;依靠日志来回滚事务(反向更新);隔离性为读未提交(部分本地事务已提交,所以能被其他事务读到,但整体事务并未提交,所以是读未提交) | 事务中对多个数据源进行操作 | 2pc |
TCC | 不需要数据库支持;准备阶段预扣留资源(锁定、冻结);提交阶段扣除资源;需要自己实现TCC三个阶段 | 事务中调用多个微服务 | 2pc |
SAGA | 需要服务和逆向服务两个接口,失败则逆向;每个事务都是独立提交,只要最终数据一致就可以 | 事务中调用多个微服务 | base |
- 总结
- XA、AT是在一个事务中操作多个数据源,理论上网网一个项目只会对应一个数据源,多个项目组成一套微服务系统,项目之间通过微服接口来相互调用,很少一个项目操作多个数据源。
- XA,AT,TCC 要求每个参与者的结果是明确的,要么成功要么失败,但一些长微服务接口,返回的结果是处理中,此时可以用SAGA模式,因为它每个微服务都是独立的,不需要整体提交回回滚。
- 在处理微服务上,SAGA比TCC更灵活也更复杂,TCC只需实现三个接口, SAGA除了实现逆向服务还需要对整个业务进行详细的设计