为了账号安全,请及时绑定邮箱和手机立即绑定

Hmily-TCC事务恢复的源码中的关键逻辑和方法

标签:
数据库

建议先关注、点赞、收藏后再阅读。
图片描述

​在Hmily-TCC事务恢复的源码中,有以下关键的逻辑和实现方法:

  1. **关键逻辑:**事务恢复管理器(TransactionRecoveryManager)

    • 事务恢复管理器负责协调和管理事务的恢复过程。
    • 它主要包含两个核心方法:register()和cancel().
    • register()方法用于将待恢复的事务注册到恢复任务队列中,等待执行。
    • cancel()方法用于取消已注册但尚未执行的恢复任务。
  2. **关键逻辑:**恢复任务(RecoverScheduledJob)

    • 恢复任务是一个定时任务,负责执行恢复操作。
    • 它实现了Quartz的Job接口,并在execute()方法中执行恢复逻辑。
    • 根据事务日志中的状态,恢复任务会分别执行补偿、提交或回滚操作。
  3. **关键逻辑:**事务日志读写器(TransactionLogReader/TransactionLogWriter)

    • 事务日志读写器负责读取和写入数据库中的事务日志。
    • 它通过JDBC连接数据库,并使用SQL语句实现对事务日志表的CRUD操作。
    • 读写器可以根据条件查询和过滤事务日志,以执行相应的恢复操作。
  4. **关键实现方法:**事务补偿

    • 在事务恢复过程中,当检测到待恢复的事务状态为“待补偿”时,会执行事务补偿逻辑。
    • 事务补偿的关键思想是反向执行已执行的分支事务的逆操作,以达到事务的一致性。
    • 具体的实现方法是根据分支事务类型(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人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消