springboot整合shardingsphere和seata实现分布式事务的实践

作者:「已注销」 时间:2021-08-10 04:28:37 

各个框架版本信息

  • springboot: 2.1.3

  • springcloud: Greenwich.RELEASE

  • seata: 1.0.0

  • shardingsphere:4.0.1

maven 依赖


       <dependency>
        <!--<groupId>io.shardingsphere</groupId>-->
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    </dependency>
    <!--sharding-jdbc 4.0.0 以后版本不能加starter 会导致启动数据源冲突-->
    <!--<dependency>-->
        <!--<groupId>com.alibaba</groupId>-->
        <!--<artifactId>druid-spring-boot-starter</artifactId>-->
    <!--</dependency>-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        <exclusions>
            <exclusion>
                <groupId>io.seata</groupId>
                <artifactId>seata-all</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-all</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.shardingsphere</groupId>
        <artifactId>sharding-transaction-base-seata-at</artifactId>
    </dependency>

需要增加的切面类

@Component
@Aspect
@Slf4j
public class SeataTransactionalAspect {
       @Before("execution(* com.XXX.dao.*.*(..))")
        public void before(JoinPoint joinPoint) throws TransactionException {
            MethodSignature signature = (MethodSignature)joinPoint.getSignature();
            Method method = signature.getMethod();
            log.info("拦截到需要分布式事务的方法," + method.getName());

        if(StringUtils.startsWithAny(method.getName(),"insert","save"
                ,"update","delete")){
            TransactionTypeHolder.set(TransactionType.BASE);
        }
    }
}

ProductServiceImpl代码

@Service
public class ProductServiceImpl implements ProductService {

    @Resource
    UserFeignClient userFeignClient;

    @Resource
    ProductDao productDao;
    
    @Override
    @GlobalTransactional(name="zhjy-product-tx-group",rollbackFor = Exception.class)
    public void createProduct(Product product) {
        productDao.insertProduct(product);
        ProductDesc proDesc = new ProductDesc();
        proDesc.setProductDesc(product.getProductDesc());
        proDesc.setStoreId(product.getStoreId());
        proDesc.setProductId(product.getProductId());
        productDao.insertProductDesc(proDesc);
//        if(product.getProductName().endsWith("5")){
//            int i = 1/0;
//        }
//        int j = 1/0;
        User user = new User();
        user.setAge(product.getPrice().intValue());
        user.setUserName(product.getProductName());
        user.setRealName(product.getProductName());
        String msg = userFeignClient.saveUser(user);
        //由于开启了服务调用降级,所以需要统一返回错误码,根据错误码主动抛出异常,让seata回滚事务
        if(msg.equals("新增用户失败")){
             int i = 1/0;
        }
    }
 }

UserFeignClient代码

@FeignClient(name="service-user",fallbackFactory =UserFeignClientFallbackFactory.class)
public interface UserFeignClient {
    @GetMapping("/user/getUserById")
    @ResponseBody
    String getUserById(@RequestParam("id") Integer id);

    @GetMapping("/user/getUserByIdWithPathVariable/{id}")
    @ResponseBody
    String getUserByIdWithPathVariable(@PathVariable("id") Integer id);

    @PostMapping("/user/saveUser")
    @ResponseBody
    String saveUser(@RequestBody User user );

}

User服务 UserController代码

@RestController
@Slf4j
@RefreshScope
public class UserController {
    @Autowired
    UserService userService;

    @PostMapping("/user/saveUser")
    @ResponseBody
    public String saveUser(@RequestBody User user) {
        userService.saveUser(user.getUserName(),user.getRealName(),user.getAge());

//        if(user.getAge()>5){
            int i = 1/0;
//        }
        return "sucess";
    }
}

UserServiceImpl代码

@Service
public class UserServiceImpl implements UserService {    
    @Resource
    UserDao userDao;

    @Override
    public void saveUser(String userName, String realName, Integer age) {
        userDao.insertUser(userName,realName,age);
    }

}

来源:https://blog.csdn.net/weixin_47574208/article/details/105948175

标签:springboot,shardingsphere,分布式事务
0
投稿

猜你喜欢

  • Java结构型设计模式中建造者模式示例详解

    2023-04-24 13:37:31
  • Java实战入门之双色球彩票小游戏

    2023-05-12 04:07:13
  • Java8 Comparator源码演示及解析

    2023-09-18 10:51:12
  • 浅谈MyBatis3 DynamicSql风格语法使用指南

    2023-11-25 13:05:06
  • 探讨:android项目开发 统筹兼顾 需要考虑的因素

    2023-08-05 11:21:32
  • 通过Java实现在Word中创建可填充表单

    2023-08-05 21:11:40
  • java实现连连看游戏课程设计

    2023-10-30 13:18:37
  • Java web访问localhost报404错误问题的解决方法

    2023-07-27 05:28:55
  • Java8新特性之泛型的目标类型推断_动力节点Java学院整理

    2023-11-26 10:38:21
  • SSM框架搭建图文教程(推荐)

    2023-11-10 20:39:07
  • mybatis-plus中lambdaQuery()与lambdaUpdate()比较常见的使用方法总结

    2023-11-24 22:43:04
  • Java Timer使用讲解

    2023-11-28 20:30:33
  • 使用反射方式获取JPA Entity的属性和值

    2023-07-24 17:43:22
  • Java多线程ThreadPoolExecutor详解

    2023-11-23 18:39:32
  • Java编程中的检查型异常与非检查型异常分析

    2023-11-04 13:08:38
  • C++程序中启动线程的方法

    2023-06-28 03:35:02
  • Java基础之面向对象机制(多态、继承)底层实现

    2023-11-12 02:59:59
  • Java实现顺序表和链表结构

    2023-11-13 09:35:43
  • SpringBoot整合之SpringBoot整合MongoDB的详细步骤

    2023-11-25 09:55:37
  • Spring @ComponentScan注解扫描组件原理

    2021-09-21 09:10:02
  • asp之家 软件编程 m.aspxhome.com