DataSourceProxy
实例化的时候全局事务发起者,就是咱们加@GlobalTransactional
注解的方法,seata会代理咱们的方法,经过如下步骤来完成全局事务。java
源码阅读入口:io.seata.spring.annotation.GlobalTransactionalInterceptor#invoke
git
rm须要代理咱们项目中的数据源,这一步须要咱们修改本身的代码,以下:github
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource druidDataSource() { return new DruidDataSource(); } /** * 须要将DataSourceProxy 设置为主数据源,不然事务没法回滚 */ @Primary @Bean("dataSource") public DataSource dataSource(DataSource druidDataSource) { return new io.seata.rm.datasource.DataSourceProxy(druidDataSource); }
代理数据源的主要目的是代理数据库链接,这样就能够控制分支事务的commit、rollback。web
seate的rm-datasoure模块中有这几个代理类DataSourceProxy、ConnectionProxy、StatementProxy,经过代理jdbc中的这几个类,让咱们的sql经过ExecuteTemplate来进行执行,这个类就是咱们了解seata怎么控制分支事务的入口。下面看分支事务的处理步骤:spring
这是PhaseOne的整个过程,下面看PhaseTwo:sql
源码阅读入口: io.seata.rm.datasource.StatementProxy#execute
数据库
用dubbo的filter实现的,源码:io.seata.integration.dubbo.TransactionPropagationFilter
app
原理就是:上游在filter中把xid放到RpcContext中,下游再从RpcContext拿到xid。框架
对RestTemplate和Feign的支持不在seata-all中,而是在spring-cloud-alibaba-seata中分布式
源码入口:
com.alibaba.cloud.seata.rest.SeataRestTemplateAutoConfiguration com.alibaba.cloud.seata.feign.SeataFeignClientAutoConfiguration com.alibaba.cloud.seata.web.SeataHandlerInterceptorConfiguration
原理就是:上游经过拦截器将xid放到请求的header中,下游经过拦截器从header中拿到xid。
seata还支持不少RPC框架,如sofa-rpc、motan等。咱们也能够经过相似的方法使seata支持咱们本身的rpc框架。
若是是用 GlobalLock 修饰的本地业务方法,虽然该方法并不是某个全局事务下的分支事务,可是它对数据资源的操做也须要先查询全局锁,若是存在其余 Seata 全局事务正在修改,则该方法也需等待。因此,若是想要Seata 全局事务执行期间,数据库不会被其余事务修改,则该方法须要强制添加 GlobalLock 注解,来将其归入 Seata 分布式事务的管理范围。
功能有点相似于 Spring 的 @Transactional 注解,若是你但愿开启事务,那么必须添加该注解,若是你没有添加那么事务功能天然不生效,业务可能出 BUG;Seata 也同样,若是你但愿某个不在全局事务下的 SQL 操做不影响 AT 分布式事务,那么必须添加 GlobalLock 注解。
seata服务端支持zk、nacos、eureka等做为服务发现,经过数据库实现数据共享,全局事务Session信息、分支事务Session信息,全局锁信息都是放在数据库中
TCC和AT的不一样主要体如今RM这边,TC和TM都是同样的。
TCC的RM不会代理咱们的数据源了,而是由咱们本身指定rollback和commit逻辑,在二阶段中,TM在发起全局事务提交回滚时,RM只须要执行咱们指定的rollback和commit方法就好了。
这种模式就是咱们业务代码的变更要多些,效率是要比AT模式高些。
RM一阶段源码入口:io.seata.spring.tcc.TccActionInterceptor#invoke
RM二阶段源码入口:io.seata.rm.tcc.TCCResourceManager#branchCommit#branchRollback
参考: