springboot+fescar注意事項
前言
最近開始學習分散式的開發,需要用到分散式事務的處理,於是學習了阿里的分散式事務框架fescar。
由於官方的文件尚未完全完成,看官方給的sample的話又不知道哪些配置是必須的,因此在寫自己的demo的時候,遇到了不少問題。
專案框架
SpringBoot+Druid+MybatisPlus+Fescar+Dubbo+Nacos
官方樣例
https://github.com/fescar-gro...
我的demo:https://github.com/ksyzz/fesc...
準備工作
1,開發前需要啟動nacos註冊中心和fescar server 。
2,將sample中的file.conf和registry.conf放到自己的resource目錄下。
3,在對應的資料庫中,建表'undo_log',該表是fescar的AT模式需要用的資料表。
CREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) NOT NULL, `log_created` datetime NOT NULL, `log_modified` datetime NOT NULL, `ext` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='fescar AT模式表';
問題與處理
-
日誌沒有顯示連線fescar server的資訊:
專案正常配置後,日誌會顯示連線fescar server的資訊,例如:c.a.f.core.rpc.netty.RmRpcClient - will connect to 127.0.0.1:8091。說明fescar的配置沒有生效。需要在 @SpringBootApplication中新增scanBasePackages 的資訊: @SpringBootApplication(scanBasePackages = "com.ksyzz.common.config")。這個原理我弄明白後會補充上來。 -
報錯:ERROR c.a.f.core.rpc.netty.TmRpcClient : no available server to connect.
出現該問題,首先檢查fescar server是否啟動,如果已經啟動,那麼檢查下面兩個配置是否一致:
file.conf中,service{vgroup_mapping.xxx="localRgoup"}和建立GlobalTransactionScanner的bean的程式碼中的return new GlobalTransactionScanner(applicationName, "xxx");兩個位置的xxx應該一致。 -
分散式事務不生效
在專案啟動後可以正常連線fescar server後,執行@GlobalTransactional的方法,丟擲異常後,發現事務並沒有回滾。出現這種情況一般是沒有配置fescar的DataSourceProxy,必須使用fescar的DataSourceProxy,才可以正常的執行全域性事務回滾的操作。比如mybatis,則需要手動註冊SqlSessionFactory的bean,並將其中的DataSource替換為fescar的DataSourceProxy,這樣才會生效。