springcloud 分布式事务 之 TX-LCN

蔚落 2022-12-27 02:12 151阅读 0赞

分为两个部分 协调器TM,多个TC,TM用来协调多个TC

TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务

模式特点:

  • 该模式对代码的嵌入性为低。
  • 该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。
  • 该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。
  • 该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。

TM端:

引入相关依赖

  1. <!--tm-->
  2. <!-- tm manager -->
  3. <dependency>
  4. <groupId>com.codingapi.txlcn</groupId>
  5. <artifactId>txlcn-tm</artifactId>
  6. <version>5.0.2.RELEASE</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>com.codingapi.txlcn</groupId>
  10. <artifactId>txlcn-tc</artifactId>
  11. <version>5.0.2.RELEASE</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>com.codingapi.txlcn</groupId>
  15. <artifactId>txlcn-txmsg-netty</artifactId>
  16. <version>5.0.2.RELEASE</version>
  17. </dependency>
  18. <!--tm-->

配置文件 properties:

  1. # TM事务管理器的服务端WEB访问端口。提供一个可视化的界面。端口自定义。
  2. server.port=7970
  3. # TM事务管理器,需要访问数据库,实现分布式事务状态记录。
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  6. spring.datasource.username=root
  7. spring.datasource.password=root
  8. # TM事务管理器,是依赖Redis使用分布式事务协调的。尤其是TCC和TXC两种事务模型。
  9. spring.redis.host=127.0.0.1
  10. spring.redis.port=6379
  11. spring.redis.database=0
  12. # 为spring应用起名。
  13. spring.application.name=tx-lcn-transaction-manager
  14. # TM事务管理器,提供的WEB管理平台的登录密码。无用户名。 默认是codingapi
  15. tx-lcn.manager.admin-key=msb
  16. # 日志。如果需要TM记录日志。则开启,赋值为true,并提供后续的配置。
  17. tx-lcn.logger.enabled=true
  18. # 为日志功能,提供数据库连接。和之前配置的分布式事务管理依赖使用的数据源不同。
  19. tx-lcn.logger.driver-class-name=com.mysql.cj.jdbc.Driver
  20. tx-lcn.logger.jdbc-url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  21. tx-lcn.logger.username=root
  22. tx-lcn.logger.password=root

在启动类上增加注解:

  1. @EnableTransactionManagerServer

TC 端(订单系统)

引入相关依赖

  1. <!-- lcn -->
  2. <dependency>
  3. <groupId>com.codingapi.txlcn</groupId>
  4. <artifactId>txlcn-tc</artifactId>
  5. <version>5.0.2.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.codingapi.txlcn</groupId>
  9. <artifactId>txlcn-txmsg-netty</artifactId>
  10. <version>5.0.2.RELEASE</version>
  11. </dependency>

yml配置文件

  1. server:
  2. port: 1001
  3. #应用名称及验证账号
  4. spring:
  5. application:
  6. name: lcn-order
  7. datasource:
  8. type: com.alibaba.druid.pool.DruidDataSource
  9. driver-class-name: com.mysql.cj.jdbc.Driver
  10. url: jdbc:mysql://localhost:3306/lcn-order?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
  11. username: root
  12. password: root
  13. dbcp2:
  14. initial-size: 5
  15. min-idle: 5
  16. max-total: 5
  17. max-wait-millis: 200
  18. validation-query: SELECT 1
  19. test-while-idle: true
  20. test-on-borrow: false
  21. test-on-return: false
  22. mybatis:
  23. mapper-locations:
  24. - classpath:mapper/*.xml
  25. eureka:
  26. client:
  27. service-url:
  28. defaultZone: http://localhost:7900/eureka/
  29. # tm配置
  30. tx-lcn:
  31. client:
  32. manager-address: 127.0.0.1:8070 #tm的地址,并非tm的服务端口号,是对外提供服务的端口

启动类上增加注解:

  1. @EnableDistributedTransaction

业务方法配置,一般写在service 层,为了演示方便,我写在了controller层

增加本地事务和lcn事务

  1. import com.codingapi.txlcn.tc.annotation.LcnTransaction;
  2. import net.sf.json.JSONObject;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.transaction.annotation.Transactional;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import org.springframework.web.client.RestTemplate;
  9. @RestController
  10. public class OrderController {
  11. @Autowired
  12. private RestTemplate restTemplate;
  13. @PostMapping("/add-order")
  14. @Transactional(rollbackFor = Exception.class)
  15. @LcnTransaction
  16. public String add(@RequestBody 数据库实体类 bean){
  17. JSONObject date = new JSONObject();
  18. date.put("payName",bean.getOrderName()+"pay");
  19. restTemplate.postForEntity("http://lcn-pay/add-pay",date,String.class);
  20. //执行数据库操作
  21. ……
  22. return "新增订单成功";
  23. }
  24. }

TC端(支付系统 服务名称lcn-pay)

业务代码:

  1. import com.codingapi.txlcn.tc.annotation.LcnTransaction;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.transaction.annotation.Transactional;
  4. import org.springframework.web.bind.annotation.PostMapping;
  5. import org.springframework.web.bind.annotation.RequestBody;
  6. import org.springframework.web.bind.annotation.RestController;
  7. @RestController
  8. public class PayController {
  9. @PostMapping("/add-pay")
  10. @Transactional(rollbackFor = Exception.class)
  11. @LcnTransaction
  12. public String addPay(@RequestBody 实体类 bean){
  13. //执行数据库操作
  14. return "新增支付成功";
  15. }
  16. }

TM 可以配置集群:

这样客户端配置修改为

  1. tx-lcn:
  2. client:
  3. manager-address: 127.0.0.1:8071,127.0.0.1:8072

参考文章:https://www.codingapi.com/docs/txlcn-preface/

发表评论

表情:
评论列表 (有 0 条评论,151人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringCloud分布式事务Seata

    1.什么是分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,简单的说,就是一次大的操作由不同的小