Seata 1.5.2 源码学习( 四 )


Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图
DataSourceProxy#getConnection()获取数据库连接
Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图
ConnectionProxy#createStatement()
Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图
ConnectionProxy#prepareStatement()
Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

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

文章插图
ExecuteTemplate#execute()  是一个模板方法
Seata 1.5.2 源码学习

文章插图
挑一个看看吧,就挑UpdateExecutor
Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

文章插图

Seata 1.5.2 源码学习

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

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

文章插图
AbstractDMLBaseExecutor#doExecute()
Seata 1.5.2 源码学习

文章插图
AbstractDMLBaseExecutor#executeAutoCommitTrue()
Seata 1.5.2 源码学习

文章插图
ConnectionProxy#changeAutoCommit()
Seata 1.5.2 源码学习

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

文章插图
UpdateExecutor#beforeImage()
Seata 1.5.2 源码学习

文章插图
BaseTransactionalExecutor#prepareUndoLog()
Seata 1.5.2 源码学习

文章插图
接下来,提交事务
ConnectionProxy#commit()
Seata 1.5.2 源码学习

文章插图
ConnectionProxy#processGlobalTransactionCommit() 处理全局事务提交
Seata 1.5.2 源码学习

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

文章插图

经验总结扩展阅读