seata客户端代码实现
第一步:POM文件引入
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>seata-ds</artifactId> <groupId>com.nacos</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>order-seata-ds</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--nacos-服务注册发现--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--添加openfeign依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--seata的依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency> </dependencies> <!-- 项目打包时会将java目录中的*.xml文件也进行打包 --> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
第二部:配置文件
server: port: 8072 # 数据源 spring: application: name: order-seata datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.43.197:3306/seata_order?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&useSSL=false username: root password: 123456 cloud: nacos: discovery: server-addr: 127.0.0.1:8848 username: nacos password: nacos namespace: public alibaba: seata: tx-service-group: my_test_tx_group # mapper文件位置 mybatis-plus: mapper-locations: classpath:com/order/seata/mapper/xml/*.xml type-aliases-package: com.order.seata.entity configuration: map-underscore-to-camel-case: true #column-underline: true 会自动将下划线格式的表字段,转换为以驼峰格式命名的属性 seata: registry: # 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC) type: nacos nacos: server-addr: 127.0.0.1:8848 # seata server 所在的nacos服务地址 application: seata-server # seata server 的服务名seata-server ,如果没有修改可以不配 username: nacos password: nacos group: SEATA_GROUP # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配 config: type: nacos nacos: server-addr: 127.0.0.1:8848 username: nacos password: nacos group: SEATA_GROUP
第三步:代码中实现分布式事务
Controller层:
package com.order.seata.controller; import com.order.seata.entity.Order; import com.order.seata.service.OrderService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/order") public class OrderController { @Autowired OrderService orderService; // 插入订单信息 @RequestMapping("/add") public String add(){ Order order=new Order(); order.setProductId(9); order.setStatus(0); order.setTotalAmount(100); orderService.create(order); return "下单成功"; } }
service层:
package com.order.seata.service.impl; import com.order.seata.api.StockService; import com.order.seata.entity.Order; import com.order.seata.mapper.OrderMapper; import com.order.seata.service.OrderService; import io.seata.spring.annotation.GlobalTransactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; @Service public class OrderServiceImpl implements OrderService { @Autowired OrderMapper orderMapper; @Autowired StockService stockService; /** * 下单 */ @GlobalTransactional @Override public Order create(Order order) { // 插入能否成功? /** * 此处面临的问题: * * 由于 47行,抛异常,所以使用 @Transactional 本地事务, * 在 37 行插入后会进行回滚,那么就不会插入成功 * 但是 46行,进行了远程调用其他微服务的接口,会进行库存减扣, * 所以 @Transactional 是无法处理, 分布式事务的 */ orderMapper.insert(order); String msg = stockService.reduct(order.getProductId()); // 异常 int a=1/0; return order; } }

浙公网安备 33010602011771号