seata应用
https://blog.csdn.net/weixin_46120888/article/details/123626096
分布式事务Seata的AT模式下两阶段提交原理
https://blog.csdn.net/qq_45076180/article/details/116795591
seata tcc理论实践
https://blog.csdn.net/huaishu/article/details/89880971
seata简单源码视频讲解
https://www.bilibili.com/video/av412910780/
*common
io.seata.core.model.GlobalStatus//status状态
*method begin
io.seata.spring.annotation.GlobalTransactionalInterceptor#invoke //方法拦截
io.seata.spring.annotation.GlobalTransactionalInterceptor#handleGlobalTransaction//请求方法存在@GlobalTransaction注解进入该方法
io.seata.tm.api.TransactionalTemplate#execute
--TransactionInfo txInfo = business.getTransactionInfo();//获取注解信息
--GlobalTransaction tx = GlobalTransactionContext.getCurrentOrCreate();//获取或者创建一个全局事务(xid)
--Propagation propagation = txInfo.getPropagation();//获取事务的传播特性
--beginTransaction(txInfo, tx);//
----io.seata.tm.api.TransactionalTemplate#beginTransaction
------io.seata.tm.api.DefaultGlobalTransaction#begin(int, java.lang.String)//TM角色向TC申请XID并绑定
--rs = business.execute();//执行业务逻辑
*mapper begin
accountMapper.updateById(account);
//io.seata.spring.annotation.datasource.SeataAutoDataSourceProxyCreator
io.seata.rm.datasource.PreparedStatementProxy#executeUpdate
io.seata.rm.datasource.exec.ExecuteTemplate#execute(io.seata.rm.datasource.StatementProxy<S>, io.seata.rm.datasource.exec.StatementCallback<T,S>, java.lang.Object...)
io.seata.rm.datasource.exec.ExecuteTemplate#execute(java.util.List<io.seata.sqlparser.SQLRecognizer>, io.seata.rm.datasource.StatementProxy<S>, io.seata.rm.datasource.exec.StatementCallback<T,S>, java.lang.Object...)
io.seata.rm.datasource.exec.BaseTransactionalExecutor#execute
io.seata.rm.datasource.exec.AbstractDMLBaseExecutor#doExecute
io.seata.rm.datasource.exec.AbstractDMLBaseExecutor#executeAutoCommitTrue
--connectionProxy.setAutoCommit(false);
--io.seata.rm.datasource.exec.AbstractDMLBaseExecutor#executeAutoCommitFalse
----TableRecords beforeImage = beforeImage();
----T result = statementCallback.execute(statementProxy.getTargetStatement(), args);
----TableRecords afterImage = afterImage(beforeImage);
----prepareUndoLog(beforeImage, afterImage);
--connectionProxy.setAutoCommit(true);
----io.seata.rm.datasource.ConnectionProxy#commit | io.seata.rm.datasource.ConnectionProxy#setAutoCommit
----io.seata.rm.datasource.ConnectionProxy#doCommit
----io.seata.rm.datasource.ConnectionProxy#processGlobalTransactionCommit
----io.seata.rm.datasource.undo.AbstractUndoLogManager#flushUndoLogs
//状态上报
io.seata.rm.datasource.ConnectionProxy#report
//重试
io.seata.rm.datasource.exec.ExecuteTemplate#execute(java.util.List<io.seata.sqlparser.SQLRecognizer>, io.seata.rm.datasource.StatementProxy<S>, io.seata.rm.datasource.exec.StatementCallback<T,S>, java.lang.Object...)
io.seata.rm.datasource.exec.BaseTransactionalExecutor#execute
io.seata.rm.datasource.exec.SelectForUpdateExecutor#doExecute
--lockRetryController.sleep(lce);