建议先关注、点赞、收藏后再阅读。
在Hmily-TCC事务恢复的源码中,有以下关键的逻辑和实现方法:
-
**关键逻辑:**事务恢复管理器(TransactionRecoveryManager)
- 事务恢复管理器负责协调和管理事务的恢复过程。
- 它主要包含两个核心方法:register()和cancel().
- register()方法用于将待恢复的事务注册到恢复任务队列中,等待执行。
- cancel()方法用于取消已注册但尚未执行的恢复任务。
-
**关键逻辑:**恢复任务(RecoverScheduledJob)
- 恢复任务是一个定时任务,负责执行恢复操作。
- 它实现了Quartz的Job接口,并在execute()方法中执行恢复逻辑。
- 根据事务日志中的状态,恢复任务会分别执行补偿、提交或回滚操作。
-
**关键逻辑:**事务日志读写器(TransactionLogReader/TransactionLogWriter)
- 事务日志读写器负责读取和写入数据库中的事务日志。
- 它通过JDBC连接数据库,并使用SQL语句实现对事务日志表的CRUD操作。
- 读写器可以根据条件查询和过滤事务日志,以执行相应的恢复操作。
-
**关键实现方法:**事务补偿
- 在事务恢复过程中,当检测到待恢复的事务状态为“待补偿”时,会执行事务补偿逻辑。
- 事务补偿的关键思想是反向执行已执行的分支事务的逆操作,以达到事务的一致性。
- 具体的实现方法是根据分支事务类型(Try/Confirm/Cancel)以及对应的逆操作,执行反向操作。
以下是对恢复任务的解析:
**恢复任务(RecoverScheduledJob)**是一个实现了Quartz的Job接口的类,用于执行恢复操作。在execute()方法中,具体的恢复逻辑会被执行。
public class RecoverScheduledJob implements Job {
private TransactionRecovery transactionRecovery;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
transactionRecovery.begin();
try {
List<TransactionLog> transactionLogs = transactionRecovery.getTransactionLogReader()
.fetchPendingTransactionLogs(transactionRecovery.getRetryMaximum());
transactionLogs.forEach(transactionLog -> transactionRecovery.getCurrentTransaction().setId(transactionLog.getId()));
for (TransactionLog transactionLog : transactionLogs) {
switch (transactionLog.getStatus()) {
case TRYING:
transactionRecovery.retryExecute(transactionLog);
break;
case CONFIRMING:
transactionRecovery.confirm(transactionLog);
break;
case CANCELLING:
transactionRecovery.cancel(transactionLog);
break;
default:
break;
}
}
} finally {
transactionRecovery.end();
}
}
}
恢复任务调用TransactionRecovery实例的相应方法(如retryExecute、confirm、cancel)执行具体的恢复操作。在每次执行恢复操作之前,会先判断事务日志的状态,以确定当前分支事务的执行方式。
switch (transactionLog.getStatus()) {
case TRYING:
transactionRecovery.retryExecute(transactionLog);
break;
case CONFIRMING:
transactionRecovery.confirm(transactionLog);
break;
case CANCELLING:
transactionRecovery.cancel(transactionLog);
break;
default:
break;
}
根据事务日志的状态,分别执行事务的补偿、提交或回滚操作,确保分支事务的一致性。执行完所有的恢复操作后,事务恢复任务结束。
事务恢复过程中,恢复任务起到了关键的作用,它通过定时触发的方式,周期性地检测和执行待恢复的事务,确保事务恢复的正确性和完整性。
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦