shardingsphere实操

目录

1. 依赖

2. 建表

2.1 建逻辑表

2.2 建物理子表

2.3 分配数据

3. application.yml

3.1 完整配置

3.2 数据源配置

3.3 规则配置

3.4 分片算法

3.5 绑定表

3.6 打印真实SQL

4. 日志文件logback-spring.xml

5. POJO类

5.1 Order

5.2 OrderDetail

5.3 OrderVO

6. 业务代码

6.1 OrderController

6.2 OrderMapper

6.3 OrderMapper.xml

7. 效果展示

7.1 接口调用

7.2 控制台SQL日志

1. 依赖

spring-boot版本为2.7.12

shardingsphere版本为5.2.0

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.7.12</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <version>2.7.12</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <version>2.7.8</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.31</version>
    </dependency>

    <dependency>
      <groupId>com.baomidou</groupId>
      <artifactId>mybatis-plus-boot-starter</artifactId>
      <version>3.5.3.1</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.32</version>
    </dependency>

    <dependency>
      <groupId>org.apache.shardingsphere</groupId>
      <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
      <version>5.2.0</version>
    </dependency>

2. 建表

2.1 建逻辑表

先建t_order和order_detail逻辑表

CREATE TABLE `t_order` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `type` varchar(255) DEFAULT NULL COMMENT '类型',
  `gmt_create` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

CREATE TABLE `order_detail` (
  `id` bigint(20) NOT NULL COMMENT '主键ID',
  `order_id` bigint(20) NOT NULL COMMENT '订单ID',
  `description` varchar(255) DEFAULT NULL COMMENT '描述',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_0900_ai_ci
  COMMENT='订单详情表';

	

2.2 建物理子表

对这两个逻辑表分别建立3个同结构的物理子表

-- 建 3 张物理表,结构与原表完全一致(无数据)
CREATE TABLE t_order_0 LIKE t_order;
CREATE TABLE t_order_1 LIKE t_order;
CREATE TABLE t_order_2 LIKE t_order;

CREATE TABLE order_detail_0 LIKE order_detail;
CREATE TABLE order_detail_1 LIKE order_detail;
CREATE TABLE order_detail_2 LIKE order_detail;

2.3 分配数据

如果原来的逻辑表已经有了很多数据,这时候建立了子表需要分配数据

t_order表对3个子表根据id为3进行取模 分配数据

INSERT INTO t_order_0 SELECT * FROM t_order WHERE id % 3 = 0;
INSERT INTO t_order_1 SELECT * FROM t_order WHERE id % 3 = 1;
INSERT INTO t_order_2 SELECT * FROM t_order WHERE id % 3 = 2;

同理, order_detail表对3个子表根据order_id对3进行取模 分配数据

INSERT INTO order_detail_0 SELECT * FROM order_detail WHERE order_id % 3 = 0;
INSERT INTO order_detail_1 SELECT * FROM order_detail WHERE order_id % 3 = 1;
INSERT INTO order_detail_2 SELECT * FROM order_detail WHERE order_id % 3 = 2;
<think>我们正在讨论ShardingSphere的分布式事务。根据引用内容,ShardingSphere提供了两种分布式事务现:强一致性和最终一致性。其中,强一致性通过XA协议现(基于两阶段提交),而最终一致性则通过柔性事务(如Saga、TCC等)现。用户要求了解ShardingSphere分布式事务的介绍、原理、使用方法及相关案例。 根据引用: - 引用[1]提到了ShardingSphere的分布式事务管理器XAShardingTransactionManager,它基于XA协议,并与JDBC规范集成。 - 引用[2]介绍了分布式事务在金融场景中的重要性,以及解决方案的深入原理。 - 引用[3]说明了在Spring中配置分布式事务管理器的关键点:启用事务管理注解和注入使用ShardingDatasource的TransactionManager。 - 引用[4]详细描述了XA事务在MySQL中的作步骤(XA START, XA END, XA PREPARE, XA COMMIT等)。 接下来,我将按照以下结构组织回答: 1. ShardingSphere分布式事务介绍:包括两种类型(强一致性和最终一致性)及其适用场景。 2. 原理:分别解释XA协议(强一致性)和柔性事务(最终一致性)的工作原理。 3. 使用方法:配置步骤和代码示例(基于引用[3]的配置和引用[4]的XA作)。 4. 相关案例:举例说明XA事务和柔性事务的使用场景。 另外,根据用户要求,在回答末尾生成相关问题。 注意:在回答中引用内容时,在引用句子的末尾添加引用标识,如[^1]。 </think>### ShardingSphere分布式事务详解 #### 一、核心介绍 ShardingSphere提供**强一致性**(基于XA协议)与**最终一致性**(基于柔性事务)两种分布式事务方案[^1],解决分库分表场景下的数据一致性问题: - **强一致性**:适用于金融、支付等对时一致性要求高的场景,通过XA协议现跨库ACID特性[^4]。 - **最终一致性**:适用于电商订单、物流等场景,通过异步补偿(如Saga/TCC)保证最终状态一致[^2]。 --- #### 二、工作原理 ##### 1. **XA强一致性模式**(两阶段提交) ```mermaid graph LR A[事务管理器] --> B[Phase 1 Prepare] B --> C[所有库锁定资源] C --> D{所有节点Ready?} D -->|Yes| E[Phase 2 Commit] D -->|No| F[Phase 2 Rollback] ``` - **关键步骤**: 1. `XA START`:开启事务并激活状态[^4] 2. 执行业务SQL(如订单扣款、库存扣减) 3. `XA PREPARE`:所有库预提交并锁定资源 4. `XA COMMIT/ROLLBACK`:全局提交或回滚[^4] - **数据库要求**:仅InnoDB引擎支持XA接口(MySQL 5.0.3+)[^4] ##### 2. **柔性事务模式**(最终一致) - **Saga模式**:正向服务链+逆向补偿链(失败时触发补偿接口)[^2] - **TCC模式**: ```java // Try阶段(资源预留) accountService.freezeBalance(100); // Confirm阶段(提交)或Cancel阶段(回滚) if(success) accountService.confirm(); else accountService.cancel(); ``` --- #### 三、使用方法(Spring Boot集成) ##### 步骤1:配置事务管理器 ```yaml # application.yml spring: shardingsphere: rules: - !TRANSACTION defaultType: XA # 使用XA协议 providerType: Atomikos # 事务管理器现 ``` ##### 步骤2:启用事务注解 ```java @Configuration @EnableTransactionManagement // 启用事务管理[^3] public class TransactionConfig { @Bean public TransactionManager transactionManager(ShardingDataSource dataSource) { return new DataSourceTransactionManager(dataSource); // 注入ShardingSphere数据源[^3] } } ``` ##### 步骤3:声明式事务控制 ```java @Service public class OrderService { @Transactional // 跨库事务注解 public void createOrder(Order order) { orderDao.insert(order); // 作订单库(分片1) inventoryDao.reduce(order); // 作库存库(分片2) } } ``` --- #### 四、典型场景案例 ##### 案例1:支付交易(XA强一致) ```sql -- 跨库事务作示例 XA START 'payment_tx'; -- 开启事务[^4] INSERT INTO pay_db.payment ... ; -- 支付库作 UPDATE order_db.orders ... ; -- 订单库作 XA END 'payment_tx'; XA PREPARE 'payment_tx'; -- 预提交 XA COMMIT 'payment_tx'; -- 全局提交 ``` **特点**:支付成功与订单状态变更原子性保证[^1] ##### 案例2:订单履约(Saga最终一致) ```mermaid graph LR A[创建订单] --> B[扣减库存] B --> C[通知物流] C -->|失败| D[恢复库存] D --> E[取消订单] ``` **补偿设计**:库存恢复接口需幂等(允许重复调用)[^2] --- #### 五、选型建议 | **场景** | **方案** | **一致性** | **性能影响** | |-------------------|----------|------------|--------------| | 账户转账/金融交易 | XA | 强一致 | 较高(阻塞) | | 订单创建/物流追踪 | Saga | 最终一致 | 低(异步) | | 库存扣减 | TCC | 最终一致 | 中(接口多) | > **提示**: > - XA事务避免长事务:设置超时`innodb_lock_wait_timeout=3s`[^4] > - Saga需现完备补偿链:如库存恢复、订单取消接口[^2] > - 分片键设计优先:通过`user_id`路由避免跨库查询[^1] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值