从** 2.1 TM 的执行流程 **我们可以看出,全局事务拦截成功后,依然是执行了业务方法的,由于seata对数据源做了代理,所以sql解析,undo_log 生成 都是在数据源代理中完成的。 主要是三个代理类:ConnectionProxy、DataSourceProxy、StatementProxy。
sql解析是在 StatementProxy中的execute 方法中完成的
1.判断是否需要走RM
首先会判断当前线程是否纳入seata全局事务,以及全局事务是否采用了AT模式,以及是否需要全局锁。如果不满足条件, 说明当前事务不需要生成undoLog日志,那么直接走原先代码逻辑就可以。
判断的方式主要是从Threadlocal里面拿 XID 和LOCKID,这也是为什么服务提供方不需要加全局事务注解也可以支持。
2.创建sql识别器集合
未完待续...