专业的编程技术博客社区

网站首页 > 博客文章 正文

峰哥分享:分布式事务Seata AT模式源码解读(一)

baijin 2024-10-08 00:41:44 博客文章 6 ℃ 0 评论

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

应用集成Seata使用AT模式的前提:

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java 应用,通过 JDBC 访问数据库

AT模式的整体机制是由两阶段提交协议的演变:

  • 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
  • 二阶段:
    • 提交异步化,非常快速地完成。
    • 回滚通过一阶段的回滚日志进行反向补偿。

Seata AT模式一阶段整体操作流程如下图所示

结合AT模式的操作流程,带来疑问:

1、如何拦截需要操作数据库的SQL语句,然后进行执行前 和 执行后的结果保存,并且支持常用主流数据库?

2、未开启AT模式时,如何继续使用原有模式操作数据库?

带着疑问思考了一下:

数据库操作中都是基于JDBC DataSource中的Connection进行SQL操作,编写代理类拦截相关DataSource,从而实现SQL操作的拦截。


一、DataSourceProxy 关键源码


二、如何拦截原始DataSource并使用DataSourceProxy?

使用AOP进行相关拦截,核心相关类:

SeataAutoDataSourceProxyCreator

SeataAutoDataSourceProxyAdvice

三、通过ConnectionProxy拦截实现PrepareStatement

数据库执行SQL时,都会通过PrepareStatement进行操作。

四、通过PrepareStatement拦截准备执行的SQL

五、根据不同的DML SQL 执行对应的Executor

5.1 解析SQL,获取SQL类型

5.2 获取执行SQL前数据 + 执行SQL + 执行SQL后数据

5.3 注册分支事务 + 保存Undo_log数据 + 提交本地事务 + 上报本地事务

六、其他应用场景的畅想

通过Seata的实现方式,本人畅想了一下其他的应用场景。

1、业务日志的保存

在很多应用系统中,都需要保存日志记录,保存的内容包括:字段更改前、更改后的字段值。

2、应用系统保存所有执行SQL语句以及安全权限管控

关键性的SQL业务日志记录,结合应用系统的用户安全权限控制最底层的添删改权限。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表