33 lines
2.8 KiB
Markdown
33 lines
2.8 KiB
Markdown
# 分布式事务: TCC模式
|
||
## TCC事务
|
||
TCC是Try、Confirm、Cancel三个单词的首字母缩写,TCC分为三个阶段:预处理(Try)、确认(Confirm)、撤销(Cancel)。
|
||
## TCC工作流
|
||
## 预处理阶段(Try phase)
|
||
在预处理阶段,请求者会请求服务的提供者做一些尝试性的操作。在该阶段,服务提供者会完成一些业务检查与验证,并且预占需要的业务资源。
|
||
## 确认阶段(Confirm phase)
|
||
- 如果服务提供者成功执行了Try阶段,并且请求者决定继续执行操作,那么请求者可以在确认阶段执行确认操作。
|
||
- ***具体的业务在确认阶段被执行***。
|
||
- 在确认阶段,不会执行更多的验证操作,所有验证操作都会在Try阶段执行
|
||
- 在Confirm阶段,只会使用Try阶段预留的业务资源
|
||
> 通常,认为Confirm阶段是不会执行失败的,如果Try阶段被成功执行,那么Confirm阶段也能成功执行,如果Try成功而Confirm执行失败,会对Confirm阶段进行重试
|
||
## 撤销阶段(Cancel phase)
|
||
在撤销阶段,如果Try阶段未正确完成且请求者决定不再继续执行,请求者可以在服务提供者上执行撤销操作。在Try阶段预占的业务资源应该在撤销阶段被正确释放
|
||
***撤销阶段(Cancel)是对预处理阶段(Try)的反向操作***
|
||
## TCC事务
|
||
对于TCC事务,全局事务管理器首先会发起所有分支事务的Try操作
|
||
- 若任何一个分支事务的Try操作执行失败,都会导致所有分支事务的Cancel操作被执行
|
||
- 若所有分支事务的Try操作都执行成功,那么全局事务管理器会发起所有分支事务的Confirm操作
|
||
在执行分支事务Confirm/Cancel操作时,如果执行失败,那么全局事务管理器会对失败操作进行重试
|
||
> 通常,Cancel阶段也被认为是一定执行成功的,如果在Cancel执行时发生错误,需要进行重试或进行人工处理
|
||
## TCC事务中需要注意的要点
|
||
### 空回滚
|
||
若是在没有调用TCC Try阶段的情况下直接调用二阶段的Cancel方法,Cancel方法需要识别出之前并未调用过Try阶段方法,直接返回Cancel成功
|
||
### 幂等
|
||
由于在各阶段执行时都存在重试机制,故而要保证Try、Confirm、Cancel接口都要保证幂等性,保证占用资源或释放资源的操作不会被重复执行
|
||
### 悬挂
|
||
在RPC调用过程中,由于网络拥堵等原因,Cancel操作可能先于Try操作执行。
|
||
> 1. 如果先调用Try时,网络拥堵发生超时,那么TM会通知RM回滚分布式事务,调用Cancel操作
|
||
> 2. 因为网络拥堵,可能调用完Cancel后,RPC的Try请求才到来
|
||
> 3. 此时到来的Try请求会预留资源,而预留资源无法被其他事务所使用
|
||
|