分布式事务接入
更新时间:2021-09-23
准备工作
- 开发环境中下载Maven并完成环境配置
- 开发环境中安装JDK1.8并完成环境配置(目前仅支持1.8版本)
- 目前仅支持与天合微服务平台结合使用,请参照"Spring-Cloud-应用接入"文档进行接入
- 将分布式事务相关的jar包安装到开发环境的Maven库中:下载事务依赖包,并按照压缩包中的README说明进行安装
引入依赖
修改pom.xml文件,根据使用场景引入所需的maven依赖。
<!--服务之间通过rest访问-->
<dependency>
<groupId>com.baidu.btcc</groupId>
<artifactId>btcc-rest-template</artifactId>
<version>2.3.0-SNAPSHOT</version>
</dependency>
<!--服务之间通过feign访问-->
<dependency>
<groupId>com.baidu.btcc</groupId>
<artifactId>btcc-spring-cloud</artifactId>
<version>2.3.0-SNAPSHOT</version>
</dependency>
添加配置项
在application.properties文件中添加如下配置,用于上传事务数据。
# 事务所属的模块名
btcc.moduleName=xxxx
# 用户鉴权信息,可以通过控制台进行查看和更新
btcc.token=xxxx
# 事务分组,需要通过控制台进行管理
btcc.transGroup=xxxx
# 事务数据的上传地址
btcc.serverAddress=list://100.64.253.71:8024
# 同步/异步执行confirm和cancel操作,true表示同步,false表示异步
btcc.isSync=false
# 连接btcc-server的超时时间
btcc.connectTimeoutMillis=200
# 访问btcc-server的读超时时间
btcc.readTimeoutMillis=1000
# 访问btcc-server的写超时时间
btcc.writeTimeoutMillis=200
# 访问btcc-server的最大连接数
btcc.maxTotalConnections=1000
# 访问btcc-server的最小空闲连接数
btcc.minIdleConnections=10
# 访问btcc-server的最大重试次数
btcc.maxTryTimes=3
# 访问btcc-server的工作线程数
btcc.workThreadNum=10
开启事务功能
开启分布式事务功能,需要在代码中额外添加配置:
- 开启对com.baidu.btcc包的扫描
- 解析btcc配置,确保可以获得BtccConfig对象
- 为RestTemplate和AsyncRestTemplate设置拦截器
修改的代码示例如下所示。
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@ComponentScan(basePackages = "com.baidu.btcc")
public class OrderApplication {
@Bean
@ConfigurationProperties("btcc")
public BtccConfig btccConfig() {
return new BtccConfig();
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Lists.newArrayList(new BtccRestTemplateInterceptor()));
return restTemplate;
}
@LoadBalanced
@Bean
public AsyncRestTemplate asyncRestTemplate(){
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
asyncRestTemplate.setInterceptors(Lists.newArrayList(new BtccRestTemplateAsyncInterceptor()));
return asyncRestTemplate;
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
业务改造
在事务发起方和事务参与方的try方法上添加注解,用于创建一条事务信息:
@BtccTransactional(confirmMethod = "", cancelMethod = "", mode="")
其中:
- confirmMethod表示事务确认函数,默认为空。
- cancelMethod表示事务取消函数,默认为空。
- mode表示事务的模式,可选,默认为MT(MT表示手动回滚,AT表示自动回滚)。
注意:
- @BtccTransactional可以保障本地事务,不需要再显式增加spring的@Transactional注解。
- 对于事务发起方,一般情况下不需要设置confirmMethod、cancelMethod。
- 对于事务参与方,在MT模式下必需提供cancelMethod,确保事务失败时可以进行回滚。
- try / confirm / cancel方法必须定义在interface中,@BtccTransactional加在实现类的方法上。
- 同一组try/confirm/cancel方法,入参必须一样。
AT模式
- 配置数据源代理
使用btcc提供的com.baidu.btcc.client.datasource.DataSourceProxy数据源代理,代码示例如下。
@Configuration
@PropertySource("classpath:application.properties")
public class DatabaseConfig {
@Value("${spring.datasource.url}")
private String jdbcUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
// 其他配置项
@Bean
public DataSource dataSource() throws SQLException {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setUsername(username);
dataSource.setPassword(password);
// 设置其他配置项
return new DataSourceProxy(dataSource);
}
}
- 创建数据库表
在数据库中创建undo_log、btcc_global_lock表,建表所需的sql语句请参考事务依赖包。
- 业务使用
在事务发起方和参与方添加注解@BtccTransactional(mode="AT")即可。
注意:
目前AT模式只支持mysql数据库
AT模式适用于相对简单的sql,若cancel场景比较复杂,建议使用MT模式