开篇

 这篇文章是用来讲解清楚TC(Transaction Coordinator:事务协调器)在处理TM发送过来的begin操作(事务开启操作)。

 核心逻辑包括GlobalSession对象的生成、GlobalSession的持久化以及XID生成。

TC begin 流程说明

  • 1.创建GlobalSession对象,GlobalSession.createGlobalSession()。
  • 2.添加周期监听器到GlobalSession当中,生命周期对象为DefaultSessionManager。
  • 3.启动GlobalSession的周期监听器,添加GlobalSession对象到全局sessionMap对象。
  • 4.启动GlobalSession的周期监听器,持久化GlobalSession对象。

TC begin 源码分析

public class DefaultCore implements Core {@Overridepublic String begin(String applicationId, String transactionServiceGroup, String name, int timeout) throws TransactionException {// 创建全局GlobalSession对象GlobalSession session = GlobalSession.createGlobalSession(applicationId, transactionServiceGroup, name, timeout);// 全局GlobalSession对象添加生命周期监听器SessionHolder.getRootSessionManager()session.addSessionLifecycleListener(SessionHolder.getRootSessionManager());// 启动全局Session对象GlobalSessionsession.begin();// 返回新生成的XID返回return XID.generateXID(session.getTransactionId());}
}

说明:

  • GlobalSession.createGlobalSession()创建全局GlobalSession对象。
  • session.addSessionLifecycleListener()给GlobalSession对象添加生命周期监听器。
  • session.begin()方法通过生命周期监听器保存全局GlobalSession对象。
  • sessionHolder.getRootSessionManager()返回DefaultSessionManager对象。
  • XID.generateXID()创建XID值。
public class GlobalSession implements SessionLifecycle, SessionStorable {// 生命周期监听器的容器private ArrayList<SessionLifecycleListener> lifecycleListeners =  new ArrayList<>();public static GlobalSession createGlobalSession(String applicationId, String txServiceGroup, String txName, int timeout) {GlobalSession session = new GlobalSession(applicationId, txServiceGroup, txName, timeout);return session;}public GlobalSession(String applicationId, String transactionServiceGroup, String transactionName, int timeout) {// 生成transactionId对象。this.transactionId = UUIDGenerator.generateUUID();this.status = GlobalStatus.Begin;this.applicationId = applicationId;this.transactionServiceGroup = transactionServiceGroup;this.transactionName = transactionName;this.timeout = timeout;}// 添加生命周期监听器public void addSessionLifecycleListener(SessionLifecycleListener sessionLifecycleListener) {lifecycleListeners.add(sessionLifecycleListener);}public void begin() throws TransactionException {this.status = GlobalStatus.Begin;this.beginTime = System.currentTimeMillis();this.active = true;for (SessionLifecycleListener lifecycleListener : lifecycleListeners) {lifecycleListener.onBegin(this);}}
}// 生成TransactionId的类和方法
public class UUIDGenerator {private static AtomicLong UUID = new AtomicLong(1000);private static int UUID_INTERNAL = 200000000;public static long generateUUID() {long id = UUID.incrementAndGet();if (id > 2000000000) {synchronized (UUID) {if (UUID.get() >= id) {id -= 2000000000;UUID.set(id);}}}return id;}
}

说明:

  • GlobalSession构造器内部通过UUIDGenerator.generateUUID()生成transactionId。
  • addSessionLifecycleListener()方法添加生命周期监听器DefaultSessionManager。
  • begin()方法调用生命周期监听器的onBegin()方法(lifecycleListener.onBegin),实现GlobalSession的持久化。
public class SessionHolder {private static final String ROOT_SESSION_MANAGER_NAME = "root.data";private static final String ASYNC_COMMITTING_SESSION_MANAGER_NAME = "async.commit.data";private static final String RETRY_COMMITTING_SESSION_MANAGER_NAME = "retry.commit.data";private static final String RETRY_ROLLBACKING_SESSION_MANAGER_NAME = "retry.rollback.data";private static SessionManager ROOT_SESSION_MANAGER;private static SessionManager ASYNC_COMMITTING_SESSION_MANAGER;private static SessionManager RETRY_COMMITTING_SESSION_MANAGER;private static SessionManager RETRY_ROLLBACKING_SESSION_MANAGER;public static void init(String sessionStorePath) throws IOException {if (sessionStorePath == null) {ROOT_SESSION_MANAGER = new DefaultSessionManager(ROOT_SESSION_MANAGER_NAME);ASYNC_COMMITTING_SESSION_MANAGER = new DefaultSessionManager(ASYNC_COMMITTING_SESSION_MANAGER_NAME);RETRY_COMMITTING_SESSION_MANAGER = new DefaultSessionManager(RETRY_COMMITTING_SESSION_MANAGER_NAME);RETRY_ROLLBACKING_SESSION_MANAGER = new DefaultSessionManager(RETRY_ROLLBACKING_SESSION_MANAGER_NAME);} else {if (!sessionStorePath.endsWith("/")) {sessionStorePath = sessionStorePath + "/";}ROOT_SESSION_MANAGER = new FileBasedSessionManager(ROOT_SESSION_MANAGER_NAME, sessionStorePath);ASYNC_COMMITTING_SESSION_MANAGER = new DefaultSessionManager(ASYNC_COMMITTING_SESSION_MANAGER_NAME);RETRY_COMMITTING_SESSION_MANAGER = new DefaultSessionManager(RETRY_COMMITTING_SESSION_MANAGER_NAME);RETRY_ROLLBACKING_SESSION_MANAGER = new DefaultSessionManager(RETRY_ROLLBACKING_SESSION_MANAGER_NAME);}}public static final SessionManager getRootSessionManager() {if (ROOT_SESSION_MANAGER == null) {throw new ShouldNeverHappenException("SessionManager is NOT init!");}return ROOT_SESSION_MANAGER;}
}

说明:

  • getRootSessionManager()返回DefaultSessionManager对象,实现生命周期接口。
public class DefaultSessionManager extends AbstractSessionManager {public DefaultSessionManager(String name) {super(name);transactionStoreManager = new TransactionStoreManager() {@Overridepublic boolean writeSession(LogOperation logOperation, SessionStorable session) {return false;}@Overridepublic void shutdown() {}@Overridepublic List<TransactionWriteStore> readWriteStoreFromFile(int readSize, boolean isHistory) {return null;}@Overridepublic boolean hasRemaining(boolean isHistory) {return false;}};}
}public abstract class AbstractSessionManager implements SessionManager, SessionLifecycleListener {protected static final Logger LOGGER = LoggerFactory.getLogger(AbstractSessionManager.class);protected Map<Long, GlobalSession> sessionMap = new ConcurrentHashMap<>();protected TransactionStoreManager transactionStoreManager;protected String name;public AbstractSessionManager(String name) {this.name = name;}@Overridepublic void addGlobalSession(GlobalSession session) throws TransactionException {if (LOGGER.isDebugEnabled()) {LOGGER.debug("MANAGER[" + name + "] SESSION[" + session + "] " + LogOperation.GLOBAL_ADD);}transactionStoreManager.writeSession(LogOperation.GLOBAL_ADD, session);sessionMap.put(session.getTransactionId(), session);}@Overridepublic void onBegin(GlobalSession globalSession) throws TransactionException {addGlobalSession(globalSession);}
}

说明:

  • DefaultSessionManager是GlobalSession的生命周期管理器。
  • DefaultSessionManager的父类AbstractSessionManager实现SessionLifecycleListener接口。
  • DefaultSessionManager的调用父类AbstractSessionManager的onBegin()方法。
  • onBegin()方法内部执行addGlobalSession()方法添加GlobalSession对象。
  • addGlobalSession()方法执行transactionStoreManager.writeSession()执行持久化,自定义的TransactionStoreManager啥都不操作。
  • transactionStoreManager是DefaultSessionManager内生成TransactionStoreManager对象。
  • addGlobalSession()方法执行sessionMap.put()保存GlobalSession对象。

Fescar TC-beigin流程相关推荐

  1. Fescar TC-commit流程

    开篇  这篇文章的目的主要是讲解Fescar TC执行commit的流程,目的是讲解清楚commit流程中的一些步骤.  遗憾的是因为commit本身Fescar的分支事务注册上报,如果事先不了解Fe ...

  2. Fescar TC-rollback流程

    开篇  这篇文章的目的主要是讲解Fescar TC执行rollback的流程,目的是讲解清楚rollback流程中的一些步骤.  遗憾的是因为rollback本身涉及Fescar的分支事务注册上报,如 ...

  3. Fescar 源码解析系列

    为什么80%的码农都做不了架构师?>>> Fescar example介绍 Fescar example解析 - TM流程 Fescar example解析 - GlobalTran ...

  4. GRS认证跟TC证有何区别

    [GRS认证跟TC证有何区别] GRS是全球回收利用规范,英文名字:GLOBALRecycledStandard(通称GRS验证)是全球化.自行化.完备的产品执行标准.供应链管理生产商操纵产品回收/再 ...

  5. ecmascript_TC39及其对ECMAScript的贡献

    ecmascript by Parth Shandilya 通过Parth Shandilya TC39及其对ECMAScript的贡献 (TC39 and its contributions to ...

  6. TC按键脚本流程五步走

    第一步:定义全局变量:hwnd .俗称句柄.再俗一点就是该窗口的编号. 代码: 变量 hwnd 第二步:脚本初始化: 代码: function init() hwnd = windowfind(&qu ...

  7. 分布式事务中间件 Fescar—RM 模块源码解读

    2019独角兽企业重金招聘Python工程师标准>>> 前言 在SOA.微服务架构流行的年代,许多复杂业务上需要支持多资源占用场景,而在分布式系统中因为某个资源不足而导致其它资源占用 ...

  8. Fescar 全局锁介绍

    开篇  这篇文章的目的主要是讲解TC的在处理分支事务注册过程中对全局锁的处理流程,理解了全局锁以后才能明白对DB同一个记录进行多次变更是如何解决的.  如上图所示,问最终全局事务A对资源R1应该回滚到 ...

  9. 源码|详解分布式事务之 Seata-Client 原理及流程

    前言 在分布式系统中,分布式事务是一个必须要解决的问题,目前使用较多的是最终一致性方案.自年初阿里开源了Fescar(四月初更名为Seata)后,该项目受到了极大的关注,目前已接近 8000 Star ...

最新文章

  1. 3月31日华为鸿蒙,华为鸿蒙OS Beta 3将从3月31日起推送
  2. Cent OS 6.4安装mysql
  3. 管理员所有权代码_为什么代码所有权糟透了,您永远不应该在有实践的地方工作...
  4. Swift - 数组排序方法(附样例)
  5. 过年不回家,压岁钱、份子钱省下来了吗?
  6. maven 编译命令
  7. Wannafly 每日一题 2016-12-26 KAOS 字典树
  8. Java多线程-while死循环
  9. ecshop 源码文件结构说明
  10. 人工智能视觉处理教程(包含源码)
  11. 4.6 linux文件系统-虚拟文件系统VFS
  12. 计算机输入法如何显示在桌面,Windows10系统启用输入法语言栏桌面提示框的方法...
  13. 添加MySQL到环境变量(超详细)
  14. 一节课轻松通关 Spark
  15. 查找badiexit
  16. MySQL 数据类型BINARY和VARBINARY
  17. IntelliJ IDEA详细配置图解,挖掘更多的功能!
  18. Moamen and XOR
  19. 企业选择MES系统不能盲目看重价格
  20. 函数 atoi() 和 itoa() 的 C 语言实现。

热门文章

  1. Learning Scrapy笔记(五)- Scrapy登录网站
  2. 不想在博问中提出的问题
  3. jmeter脚本增强
  4. Spring MVC的国际化
  5. JSP Cookie 处理
  6. 08-09 性能测试--CPU分析
  7. graphics | 基础绘图系统的拼图方法之三:使用mfrow、mfcol参数和layout函数
  8. 复杂存储过程学习_AI数据存储设备选型的6个关键要素
  9. c语言程序设李忠成主编答案,2007—2008学年第二学期基础学院上机课程表.doc
  10. FTP文件传输协议介绍和常用命令