
文章插图

文章插图
DataSourceProxy#getConnection()获取数据库连接

文章插图

文章插图
ConnectionProxy#createStatement()

文章插图

文章插图

文章插图

文章插图
ConnectionProxy#prepareStatement()

文章插图

文章插图
PreparedStatementProxy 继承自 StatementProxy,因此下面就直接看PreparedStatementProxy如何执行SQL
PreparedStatementProxy#execute()

文章插图
ExecuteTemplate#execute() 是一个模板方法

文章插图
挑一个看看吧,就挑UpdateExecutor

文章插图

文章插图

文章插图
UpdateExecutor构造方法中一直调父类的构造法,既然如此,那么直接看BaseTransactionalExecutor

文章插图
UpdateExecutor#execute()
这个方法时从BaseTransactionalExecutor那里继承来的,又是一个模板方法,可见设计模式是多么重要

文章插图
AbstractDMLBaseExecutor#doExecute()

文章插图
AbstractDMLBaseExecutor#executeAutoCommitTrue()

文章插图
ConnectionProxy#changeAutoCommit()

文章插图
现在事务自动提交已经被Seata改成false了

文章插图
UpdateExecutor#beforeImage()

文章插图
BaseTransactionalExecutor#prepareUndoLog()

文章插图
接下来,提交事务
ConnectionProxy#commit()

文章插图
ConnectionProxy#processGlobalTransactionCommit() 处理全局事务提交

文章插图
分支事务提交以后,业务数据更改和undo_log就都提交了
回想一下,为什么在执行业务修改前要先将默认的自动提交改成手动提交,最后再改成自动提交呢?
因为,要将业务数据修改和插入undo_log放在同一个事务里,一起提交
这一切都归功于代理
回顾一下整个调用链

文章插图
经验总结扩展阅读
- .NET 源码学习 [数据结构-线性表1.2] 链表与 LinkedList<T>
- Redisson源码解读-公平锁
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
- Redisson源码解读-分布式锁
- 源码级深度理解 Java SPI
- Dubbo-聊聊通信模块设计
- 【lwip】10-ICMP协议&源码分析
- 【lwip】09-IPv4协议&超全源码实现分析
- 从BeanFactory源码看Bean的生命周期