闲谭SpringBoot--ShardingSphere分布式事务探究

server/2025/1/18 2:35:35/

文章目录

  • 0. 背景
  • 1. 未分库分表
  • 2. 仅分表时
  • 3. 分库分表
    • 3.1 不涉及分库表
    • 3.2 涉及分库表,且分库表处于一个库
    • 3.3 涉及分库表,且分库表处于多个库
    • 3.4 涉及分库表,且运行中某库停机
  • 4. 小结

0. 背景

接上篇文章《闲谭SpringBoot–ShardingSphere分库分表探究》,我已经完成分库分表的项目搭建。

本篇探究在不同情况下,事务是否正常运作。

1. 未分库分表

针对不分库的user表,故意抛出异常,看看能否回滚。

执行前:
在这里插入图片描述
执行代码:

     /*** 在未分库分表的情况下,可以正常回滚*/@Transactional(rollbackFor = Exception.class)public int testWithNoDivide() throws Exception {UserDo user = new UserDo();user.setId("2");user.setName("testWithNoDivide");int re = userService.add(user);if (true) {throw new Exception("err");}return re;}

执行后,由于抛出异常,事务回滚,数据库中的内容并未改变。

测试通过。

2. 仅分表时

如果将log表按时间进行分表,我们看能否回滚。

首先验证只使用@Transactional(rollbackFor = Exception.class)能否回滚多个表:

	/*** 在仅分表的情况下,测试是否可以回滚*/@Transactional(rollbackFor = Exception.class)public int testWithTableDivide() throws Exception {// 改用户UserDo user = new UserDo();user.setId("2");user.setName("testWithTableDivide");int reUser = userService.add(user);// 改日志LogDo log = new LogDo();log.setId("111");log.setTime("2025-01-01 11:11:11");log.setContent("testWithTableDivide");int reLog = logService.add(log);// 抛出异常if (true) {throw new Exception("err");}return reUser + reLog;}

通过验证,发现是可以正常回滚的,所以在仅分表不分库的情况下,使用@Transactional(rollbackFor = Exception.class)足矣。

3. 分库分表

如果既分库、又分表,是否需要开启分布式事务呢?

我们分两步验证,首先验证不涉及分库的表时,其次验证涉及分库的表时。

3.1 不涉及分库表

此时对log分库分表,测试user是否能正常回滚:

	/*** 在未分库分表的情况下,可以正常回滚*/@Transactional(rollbackFor = Exception.class)public int testWithNoDivide() throws Exception {UserDo user = new UserDo();user.setId("2");user.setName("testWithNoDivide");int re = userService.add(user);if (true) {throw new Exception("err");}return re;}

这个应该是没有悬念的,不涉及分库的表,没必要开启分布式事务

3.2 涉及分库表,且分库表处于一个库

我们同时修改user表、log表,但是让user和log处于一个数据库ds0里面,测试能否回滚

  	/*** 涉及分库表,且分库表处于一个库*/@Transactional(rollbackFor = Exception.class)public int testDbDivdeButInOneDb() throws Exception {// 改用户UserDo user = new UserDo();user.setId("2");user.setName("testDbDivdeButInOneDb");int reUser = userService.add(user);// 改日志1LogDo log1 = new LogDo();log1.setId("111");log1.setTime("2025-01-01 11:11:11");log1.setContent("testDbDivdeButInOneDb");log1.setDepartId("0");int reLog1 = logService.add(log1);// 改日志2LogDo log2 = new LogDo();log2.setId("222");log2.setTime("2025-02-02 11:11:11");log2.setContent("testDbDivdeButInOneDb");log2.setDepartId("0");int reLog2 = logService.add(log2);// 抛出异常if (true) {throw new Exception("err");}return reUser + reLog1 + reLog2;}

正常回滚,说明当表在一个库中时,使用@Transactional(rollbackFor = Exception.class)即可。

3.3 涉及分库表,且分库表处于多个库

我们再构造一个在不同库的例子,看能否回滚。

	/*** 涉及分库表,且分库表处于多个库*/@Transactional(rollbackFor = Exception.class)public int testDbDivdeButInTwoDb() throws Exception {// 改日志1LogDo log1 = new LogDo();log1.setId("111");log1.setTime("2025-01-01 11:11:11");log1.setContent("testDbDivdeButInOneDb");log1.setDepartId("0");//在库ds0中!int reLog1 = logService.add(log1);// 改日志2LogDo log2 = new LogDo();log2.setId("222");log2.setTime("2025-02-02 11:11:11");log2.setContent("testDbDivdeButInOneDb");log2.setDepartId("1");//在库ds1中!int reLog2 = logService.add(log2);// 抛出异常if (true) {throw new Exception("err");}return reLog1 + reLog2;}

实测证明依然回滚。

3.4 涉及分库表,且运行中某库停机

我们启动项目后,将ds1停止运行,然后测试,依然可以。

4. 小结

经查询文档,在不指定TransactionType,默认采用的TransactionType.LOCAL枚举值,这个用法已经够用了。

可以通过@ShardingTransactionType(TransactionType.XA)改为其他事务类型。


http://www.ppmy.cn/server/159236.html

相关文章

算法竞赛(蓝桥杯)贪心算法1——数塔问题

题目描述 有如下所示的数塔,要求从底层走到顶层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 输入 输入数据首先包括一个整数整数 N (1≤N≤100),表示数塔的高度,接下来用 N 行数字表示…

C++实现设计模式---代理模式 (Proxy)

代理模式 (Proxy) 代理模式 是一种结构型设计模式,它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问,通常用于在不改变目标对象的情况下&#xff0…

【Flink系列】1.概述

1. Flink概述 1.1 Flink是什么 1.1.1 Flink是什么 Flink的官网主页地址:https://flink.apache.org/ 1.1.2 有界流和无界流 1.1.2 有状态流处理 1.1.3 Flink 的发展历史 1.2 Flink特点 1.3 Flink vs SparkStreaming 1.4 Flink 的应用场景 1.5 Flink 分层 API

深度学习camp-第J7周:对于ResNeXt-50算法的思考

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 📌你需要解决的疑问:这个代码是否有错?对错与否都请给出你的思考 📌打卡要求:请查找相关资料、逐步…

【认识油管头部频道】ep5 “5-Minute Crafts”——DIY 和生活技巧

5-Minute Crafts 是一个非常受欢迎的 DIY 和生活技巧频道,它的火爆有多方面的原因: 1. 简单实用的内容 视频主要以解决日常生活中遇到的小问题为主,提供简单易学的技巧,吸引了想快速获取实用知识的观众。 2. 短视频形式 每个视…

Elasticsearch技术标准解析与实践案例

一、引言 Elasticsearch(简称ES)是一个分布式、高扩展、高实时的搜索与数据分析引擎。它不仅能够进行全文搜索和分布式实时分析,还具备分布式的实时文档存储能力,支持上百个服务节点的扩展,并能处理PB级别的结构化或非结构化数据。本文旨在深入探讨Elasticsearch的技术原…

[Linux]——进程(2)

目录 ​编辑 一、前言 二、正文 2.1 进程状态 R/R状态 S状态 D状态 T/t状态 X状态 Z状态 2.2孤儿进程 2.3进程优先级 2.3.1基本概念 2.3.2PRI and NI 一、前言 在这一章,会为大家进行进程状态以及进程优先级的讲解 二、正文 2.1 进程状态 在一节中我们简…

idea上git log面板的使用

文章目录 各种颜色含义具体的文件的颜色标签颜色🏷️ 节点和路线 各种颜色含义 具体的文件的颜色 红色:表示还没有 git add 提交到暂存区绿色:表示已经 git add 过,但是从来没有 commit 过蓝色:表示文件有过改动 标…