开篇
这个系列开始介绍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的解析。