目录
分布式事务是如何产生的?
现有的问题:服务1给服务2和服务3发送消息,服务2和服务3都要去操作自己的MySQL数据库,然而服务3出现了异常,怎么解决?
以上的分析已经非常明显了,一般的事务解决不了。下面看一下分布式事务是如何解决的:
TX- LCN实现分布式事务
基于三段提交和TCC实现的
TX-LCN分布式事务框架,LCN并不生产事务,LCN只是本地事务的协调工,LCN是一个高性能的分布式事务框架,兼容dubbo、springcloud框架,支持RPC框架拓展,支持各种ORM框架、NoSQL、负载均衡、事务补偿.
1、一致性,通过TxManager协调控制与事务补偿机制确保数据一致性
2、易用性,仅需要在业务方法上添加@TxTransaction注解即可
3、高可用,项目模块不仅可高可用部署,事务协调器也可集群化部署
4、扩展性,支持各种RPC框架扩展,支持通讯协议与事务模式扩展
文档地址:https://www.codingapi.com/docs/txlcn-setting-manager/
1、搭建事务的协调者
a)导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tm</artifactId> <version>5.0.2.RELEASE</version> </dependency>
b)在yml中配置信息
a)数据库一定要写hikari下面
server: port: 8888 spring: datasource: hikari: username: root password: 123 driver-class-name: com.mysql.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/tx-manager url: jdbc:mysql://localhost:3306/tx-manager jpa: hibernate: use-new-id-generator-mappings: false redis: host: 1111.com tx-lcn: manager: port: 8070
c)在主启动类开启注解
@EnableTransactionManagerServer
2、搭建事务的参与者
a)导入依赖
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-txmsg-netty</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
b)在yml中配置
a)连接事务的参与者
spring: datasource: url: jdbc:mysql://localhost:3306/shop-order-1 username: root password: 123 driver-class-name: com.mysql.jdbc.Driver server: port: 8081 tx-lcn: client: manager-address: localhost:8070 spring: datasource: url: jdbc:mysql://localhost:3306/shop-order-2 username: root password: 123 driver-class-name: com.mysql.jdbc.Driver server: port: 8092 tx-lcn: client: manager-address: localhost:8070
c)在主启动类上开启注解
@EnableDistributedTransaction
d)在业务层添加分布式事务注解
@Transactional
@LcnTransaction // 分布式事务
@Service
public class ServerServiceImpl {
@Autowired
private ServerMapper serverMapper;
@Autowired
private RestTemplate restTemplate;
@Transactional
@LcnTransaction // 分布式事务
public void add() {
// 1.先给shop-order-1中插入一条记录
serverMapper.add("server-1");
System.out.println("插入server-1成功");
// 模拟在调用过从中出现异常
// int i = 10 / 0;
// 2.调用server2再给shop-order-2中插入一条记录
String forObject = restTemplate.getForObject("http://localhost:8092/server2/add", String.class);
System.out.println("插入server-2成功,返回值:" + forObject);
}
}