上一篇 <<<Seata-核心源碼分析
下一篇 >>>Seata與Lcn的區(qū)別
1.事務協調者(TC)啟動
A、創(chuàng)建數據庫,并執(zhí)行sql: db_store.sql
B、修改 registry.conf和file.conf配置
Registry.conf支持:file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
file.conf:修改db信息
C、seata-server.sh啟動腳本
2.發(fā)起方TM和參與方RM整合
在關聯的數據庫里執(zhí)行db_undo_log.sql后在執(zhí)行下面操作
2.1 引入jar包依賴
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
2.2 配置修改
spring:
cloud:
nacos:
discovery:
server-addr: 10.211.55.16:8848
#feign客戶端的命名必須使用中劃線,不能使用下劃線
refresh:
enabled: false
#seata配置
alibaba:
seata:
tx-service-group: my_test_tx_group
application:
name: seata-user-service
datasource:
url: jdbc:mysql://localhost:3306/jarye?useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
拷貝registry.conf和file.conf到配置文件地方
其中tx-service-group的配置要和file.conf里的vgroup_mapping名稱一致
service {
vgroup_mapping.my_test_tx_group = "default"
default.grouplist = "127.0.0.1:8091"
}
2.3 剔除默認數據源
//自定義配置
@Configuration
public class DataSourceProxyConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new DruidDataSource();
}
@Bean
public DataSourceProxy dataSourceProxy(DataSource dataSource) {
return new DataSourceProxy(dataSource);
}
@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSourceProxy dataSourceProxy) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceProxy);
sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
return sqlSessionFactoryBean.getObject();
}
}
啟動的地方剔除默認的數據源加載
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@MapperScan("com.jgspx.mapper")
public class SeataUserApp {
public static void main(String[] args) {
SpringApplication.run(SeataUserApp.class);
}
}
2.4 注解使用
只要在發(fā)起方增加注解,參與方不用任何注解
@GlobalTransactional
@GetMapping("/orderToMember")
public String orderToMember(Long userId) {
orderMapper.insertUser(userId+"");
String result = userServiceFeign.getUser(userId);
return "我是訂單服務,調用會員服務接口返回結果:" + result;
}
2.5 通過日志來驗證
當出現異常或超時,日志信息:
Branch Rollbacked result: PhaseTwo_Rollbacked
當執(zhí)行成功,日志信息:
Branch commit result: PhaseTwo_Committed
推薦閱讀:
<<<分布式事務產生的背景
<<<解決分布式事務的核心思路
<<<柔性事務和剛性事務(ACID)
<<<CAP理論簡單概況
<<<Base理論核心思想
<<<一致性協議--XA接口
<<<一致性協議--Jta規(guī)范
<<<一致性協議--2PC提交協議
<<<一致性協議--3PC提交協議
<<<2PC與3PC協議的提交區(qū)別
<<<主流的分布式事務解決框架
<<<LCN-框架介紹
<<<LCN-實現原理剖析
<<<LCN-事務協調者(TM)安裝啟動
<<<SpringBoot整合LCN
<<<LCN-核心源碼分析
<<<LCN-集群模式介紹
<<<Seata-框架介紹
<<<Seata原理實現/執(zhí)行流程/生命周期
<<<Seata-TM執(zhí)行時突然宕機了會造成什么問題
<<<Seata-核心源碼分析
<<<Seata與Lcn的區(qū)別