Fescar - RM实现原理介绍

开篇

 这个系列开始介绍Fescar当中的RM(Resource Manager),RM负责控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。


Fescar RM介绍


说明:

  • RM负责注册分支事务并上报分支事务状态。
  • RM负责响应TM的Branch Commit/Rollback指令,驱动本地事务的执行或回滚。


    public void demoByLowLevelAPI() throws Throwable {
        // 0. init
        init();

        // 1. get or create a transaction
        GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();

        // 2. begin transaction
        try {
            tx.begin(30000, "my_tx_instance");

        } catch (TransactionException txe) {
            // TODO: Handle the transaction begin failure.

        }

        Object rs = null;
        try {

            // Do Your BusinessService
            businessCall1();
            businessCall2();
            businessCall3();

        } catch (Throwable ex) {

            // 3. any business exception, rollback.
            try {
                tx.rollback();

                // 3.1 throw the business exception out.
                throw ex;

            } catch (TransactionException txe) {
                // TODO: Handle the transaction rollback failure.

            }

        }

        // 4. everything is fine, commit.
        try {
            tx.commit();

        } catch (TransactionException txe) {
            // TODO: Handle the transaction rollback failure.

        }
    }

说明:

  • JDBC事务标准三步曲,begin/commit/rollback。
  • 发起指令的对象是TM,由TC负责协调并通知RM进行执行(RM上报执行状态)。


Fescar基本原理

Fescar的RM使用JDBC 数据源代理,作为拦截的核心实现

说明:

  • RM的JDBC代理按照传统的DataSource、Connection、Statement等层次去进行代理。
  • 从我个人角度来说,RM的代理相当于针对JDBC的所有层进行了拦截,这样子可以织入个体的代码。
  • 基础可以参考JDBC—Connection、Statement、ResultSet



说明:

  • 通过Fescar的JDBC数据源代理通过对业务 SQL 的解析,把业务数据在更新前后的数据镜像组织成回滚日志,利用本地事务的ACID特性,将业务数据的更新和回滚日志的写入在同一个本地事务中提交。
  • 保证任何提交的业务数据的更新一定有相应的回滚日志存在。




说明:

  • 如果决议是全局提交,此时分支事务此时已经完成提交,不需要同步协调处理(只需要异步清理回滚日志)。




说明:

  • 如果决议是全局回滚,RM 收到协调器发来的回滚请求,通过 XID 和 Branch ID 找到相应的回滚日志记录,通过回滚记录生成反向的更新 SQL 并执行,以完成分支的回滚。


Fescar RM代理源码

说明:

  • com.alibaba.fescar.rm.datasource.DataSourceProxy负责创建ConnectionProxy对象。
  • com.alibaba.fescar.rm.datasource.ConnectionProxy负责创建StatementProxy对象。
  • com.alibaba.fescar.rm.datasource.StatementProxy负责执行Statentment。


期待

 真正的核心在于对DataSourceProxy、ConnectionProxy、StatementProxy的解析。

猜你喜欢

转载自yq.aliyun.com/articles/690046