框架

首先要有一个ShardingJdbc的框架,没有的话可以查看

ShardingJdbc分库分表+连表查询(超简单)-CSDN博客

使用的是同一个框架,下面的步骤都是基于上面的框架实现的

下载依赖


        <!-- 分布式事务管理 -->
        <dependency>
            <groupId>io.shardingsphere</groupId>
            <artifactId>sharding-transaction-spring-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>

注意:分布式事务的版本一定要和我的ShardingJdbc版本一致,不然可能发生冲突

业务代码

 @Transactional(rollbackFor = Exception.class)
 @ShardingTransactionType(TransactionType.XA)
 @PostMapping("/saveTest")
 public void saveTest(){

  //创建测试两条数据分别插入两条库
  DemoOrder demoOrder = new DemoOrder();
  demoOrder.setName("111");
  demoOrder.setUserId(100L);
  demoOrder.setActivityId(100L);

  DemoOrder demoOrder1 = new DemoOrder();
  demoOrder1.setName("222");
  demoOrder1.setUserId(99L);
  demoOrder1.setActivityId(99L);
  orderMapper.insert(demoOrder);

  orderMapper.insert(demoOrder1);

  //抛出异常
//  throw new RuntimeException();

 }

测试

可以看到无异常情况可以正常添加,删除数据,我们打开异常的注释重新测试

可以看到程序已经抛出了异常

很明显,数据库是没有数据的

避免踩坑

首先就是不要捕捉异常,因为捕捉异常会导致事务不生效。

注意异常形式,抛出的异常不是RuntimeException 运行时异常也不生效,这个可以通过

@Transactional(rollbackFor = Exception.class) 这个注解规定生效异常。

XA是强一致性的事务,测试的时候,在添加语句打断点测试是没有数据的,强一致性只有在方法运行完才回统一提交,不要打了半天断点没有数据。

Logo

更多推荐