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
參考: