Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

XA MYSQL CONNECTION #2

Open
Charlie17Li opened this issue Feb 12, 2023 · 1 comment
Open

XA MYSQL CONNECTION #2

Charlie17Li opened this issue Feb 12, 2023 · 1 comment

Comments

@Charlie17Li
Copy link
Owner

Charlie17Li commented Feb 12, 2023

XA MYSQL CONNECTION

背景

由于当前使用的第三方 mysql 包 没有计划去支持 XA事务,需要自己设计并实现 MYSQL Conn 用来支持 XA 分布式事务

MYSQL 原生 XA 事务命令

实现 seata-go XA 分布式事务的前提是,底层数据库支持 XA 本地事务。因为 MYSQL 原生支持,所以可以集成 MYSQL

XA START '自定义事务id';

SQL语句...

XA END '自定义事务id';
XA PREPARE '自定义事务id';         # 对事务进行持久化
XA COMMIT\ROLLBACK '自定义事务id';

时序图

借鉴 AT 事务执行流程,通过分析 seata AT 事务代码,做出如下时序图, 此图从用户开始执行 ExecContext 开始绘制,向 TC 注册 XID 阶段省略。执行事务时,和 AT 不一样的部分主要在 driver.Conn:

  1. 在执行 SQL 前,需要执行 XA START(不同数据库可能实现不同,MSYQL 执行 XA START)
  2. 根据 Executor 的结果,执行 XA PREPARE or XA ROLLBACK(包括 XA END )
  3. 在Commit阶段时,注册分支事务,并在每个分支事务中执行 XA COMMIT,如有异常则回滚,最终向 TC 进行汇报
  4. 最后在提交全局事务的时候,TC 通知 RM 调用 XASourceManager 开始提交分支事务

image

类图

todo

@Charlie17Li
Copy link
Owner Author

code ref apache/incubator-seata-go#380

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant