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; } }

 

posted @ 2022-03-08 22:34  VNone  阅读(93)  评论(0)    收藏  举报