前言
最近开始学习分布式的开发,需要用到分布式事务的处理,于是学习了阿里的分布式事务框架 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”)。这个问题偶尔出现,正常情况下不加 scanBasePackages 也可以使用(– 懵逼脸 –)
报错: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,这样才会生效。