基于ShardingJdbc实现分布式事务(超简单)
首先要有一个ShardingJdbc的框架,没有的话可以查看使用的是同一个框架,下面的步骤都是基于上面的框架实现的。
·
框架
首先要有一个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是强一致性的事务,测试的时候,在添加语句打断点测试是没有数据的,强一致性只有在方法运行完才回统一提交,不要打了半天断点没有数据。
更多推荐
所有评论(0)