当前位置:   article > 正文

SpringBoot 整合 ShardingSphere4.1.1实现分库分表_springboot shardingsphere

springboot shardingsphere

目录

前言

一、ShardingSphere4.1.1的spring boot配置

二、ShardingSphere的分片策略

三、SpringBoot 整合 ShardingSphere4.1.1

、ShardingSphere实现分布式事务控制


前言

    ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

一、ShardingSphere4.1.1的spring boot配置

引入Maven依赖

  1. <!-- for spring boot -->
  2. <dependency>
  3. <groupId>org.apache.shardingsphere</groupId>
  4. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  5. <version>4.1.1</version>
  6. </dependency>

Spring boot的yaml规则配置

  1. spring:
  2. shardingsphere:
  3. enabled: true #是否开启sharding
  4. props:
  5. sql:
  6. show: true #是否显示sql语句日志
  7. #多数据源配置
  8. datasource:
  9. names: master,slave1,slave2 #自定义真实的数据源名字,多个数据源逗号隔开
  10. master: #主数据源,master来自上方真实数据源取的名字
  11. type: com.alibaba.druid.pool.DruidDataSource
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. url: jdbc:mysql://127.0.0.1:3306/master
  14. username: demo
  15. password: 123456
  16. #xxx:xx #数据库连接池的其它属性
  17. salve1: #从数据源,salve1来自上方真实数据源取的名字
  18. type: com.alibaba.druid.pool.DruidDataSource
  19. driver-class-name: com.mysql.cj.jdbc.Driver
  20. url: jdbc:mysql://127.0.0.1:3306/salve1
  21. username: demo
  22. password: 123456
  23. salve2: #从数据源,salve2来自上方真实数据源取的名字
  24. type: com.alibaba.druid.pool.DruidDataSource
  25. driver-class-name: com.mysql.cj.jdbc.Driver
  26. url: jdbc:mysql://127.0.0.1:3306/salve1
  27. username: demo
  28. password: 123456
  29. #主从节点,读写分离配置 (在不使用数据分片功能,只需要读写分离功能情况下的配置)
  30. masterslave:
  31. name: ms #自定义一个虚拟数据源名字,用于自动路由下方主从数据源
  32. master-data-source-name: master # 指定主数据源
  33. slave-data-source-names: # 指定从数据源
  34. - slave1
  35. - slave2
  36. load-balance-algorithm-type: round_robin #从库负载均衡算法类型,可选值:ROUND_ROBIN,RANDOM
  37. #数据分片 + 读写分离
  38. sharding:
  39. master-slave-rules: #在使用数据分片功能情况下,配置读写分离功能
  40. ds0: #自定义一个虚拟数据源名字,用于自动路由下方主从数据源
  41. masterDataSourceName: master # 指定主数据源
  42. slaveDataSourceNames: # 指定从数据源
  43. - slave1
  44. - slave2
  45. loadBalanceAlgorithmType: round_robin
  46. binding-tables:
  47. - t_user #指明了分库分表要处理的虚拟表名字
  48. tables:
  49. t_user: #自定义一个虚拟表名字,后续sql语句中就使用这个表名字,会自动路由到真实的表名
  50. actualDataNodes: master$->{1..2}.t_user$->{1..10} #指定真实的数据源.表名,这里表示两个master数据源,10张表t_user
  51. keyGenerator: #主键自动生成策略
  52. column: uid #指定表字段名
  53. type: SNOWFLAKE #指定雪花算法
  54. props:
  55. worker: #指定雪花算法的工作中心
  56. id: 1
  57. #分表策略, 可选项有 inline, standard, complex, hint, none
  58. tableStrategy:
  59. inline: #inline(行表达式分片策略)- 根据单一分片键进行精确分片
  60. shardingColumn: uid #指定分片键(表字段)
  61. algorithmExpression: t_user$->{uid%2+1} #指定分片算法,这里是取模算法
  62. standard: #standard(标准分片策略) - 根据单一分片键进行精确或者范围分片
  63. shardingColumn: uid
  64. #指定精确分片算法的实现类, 必选项
  65. preciseAlgorithmClassName: cn.demo.strategy.TablePreciseAlgorithm
  66. #指定范围分片算法的实现类
  67. rangeAlgorithmClassName: cn.demo.strategy.TableRangeAlgorithm
  68. complex: #complex(复合分片策略) - 根据多个分片键进行精确或者范围分片
  69. shardingColumn: uid
  70. #指定复合分片算法实现类
  71. algorithmClassName: cn.demo.strategy.TableComplexAlgorithm
  72. hint: #hint策略 - 使用与sql无关的方式进行分片
  73. #指定hint分片算法实现类
  74. algorithmClassName: cn.demo.strategy.DbHintAlgorithm
  75. none: #不使用分片策略
  76. #分库策略, 可选项有 inline, standard, complex, hint, none
  77. databaseStrategy:
  78. inline: #配置跟上方表策略相同
  79. standard:
  80. hint:
  81. none:

二、ShardingSphere的分片策略

  • inline(行表达式分片策略) - 根据单一分片键进行精确分片
  • standard(标准分片策略) - 根据单一分片键进行精确或者范围分片
  • complex(复合分片策略) - 根据多个分片键进行精确或者范围分片
  • hint策略 - 使用与sql无关的方式进行分片

1. inline(行表达式分片策略) - 根据单一分片键进行精确分片

对应InlineShardingStrategy。使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如: user_$->{u_id % 8} 表示t_user表根据u_id模8,而分成8张表,表名称为user_0到user_7。

  1. #inline 单分片键策略, sql不支持 >, <, between and
  2. #分表策略配置
  3. table-strategy:
  4. inline:
  5. sharding-column: cid #分片字段
  6. algorithm-expression: course_$->{cid%2+1} #分片算法,取模
  7. #分库策略配置
  8. database-strategy:
  9. inline:
  10. sharding-column: cid #分片字段
  11. algorithm-expression: db_$->{cid%2+1} #分片算法,取模
2. standard(标准分片策略) - 根据单一分片键进行精确或者范围分片

对应StandardShardingStrategy,支持精确和范围分片,提供对SQL语句中的=,IN,BETWEEN AND、>、<、>=、<=的分片操作支持。

精确分片算法接口: PreciseShardingAlgorithm, 必选的,用于处理=和IN的分片

范围分片算法接口: RangeShardingAlgorithm,用于处理BETWEEN AND, >, <, >=, <=分片

  1. #standard 单分片键策略, 支持精确和范围分片
  2. #分表策略配置
  3. table-strategy:
  4. standard:
  5. sharding-column: cid #分片字段
  6. #指定精确分片算法的实现类, 必选项
  7. precise-algorithm-class-name: cn.demo.strategy.TablePreciseAlgorithm
  8. #指定范围分片算法的实现类
  9. range-algorithm-class-name: cn.demo.strategy.TableRangeAlgorithm
  10. #分库策略配置
  11. database-strategy:
  12. standard:
  13. sharding-column: cid
  14. precise-algorithm-class-name: cn.demo.strategy.DbPreciseAlgorithm
  15. range-algorithm-class-name: cn.demo.strategy.DbRangeAlgorithm

自定义类实现精确或范围分片算法

注意:集合参数Collection<String> availableTargetNames 表示数据源或者实际表的名字集合,

如果是分表策略就是实际表的名字集合, 如果是分库策略就是数据源名字集合

  • table分表策略
  1. /**
  2. * standard分片策略的表精确分片算法实现类
  3. * 实现接口 PreciseShardingAlgorithm<T>, 泛型类T是分片键的字段类型
  4. */
  5. public class TablePreciseAlgorithm implements PreciseShardingAlgorithm<Long> {
  6. /**
  7. * 精确分片算法:用于处理=和IN的分片
  8. * @param availableTargetNames - 数据源或者实际表的名字集合
  9. * @param preciseShardingValue - 包含逻辑表名、分片列和分片列的值
  10. * @return 返回分片后的实际表名
  11. */
  12. @Override
  13. public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
  14. //获取分片列的值
  15. Long value = preciseShardingValue.getValue();
  16. //获得虚拟表名
  17. String logicTableName = preciseShardingValue.getLogicTableName();
  18. //实现course_$->{cid%2+1} 取模分片算法
  19. long index = value % 2 + 1;
  20. //拼接获得实际表名
  21. String actualTableName = logicTableName + "_" + index;
  22. //判断配置的实际表集合中是否有该实际表名
  23. if(availableTargetNames.contains(actualTableName)) {
  24. return actualTableName;
  25. }
  26. return null;
  27. }
  28. }
  1. /**
  2. * standard分片策略的范围分片算法实现类
  3. * 实现接口 PreciseShardingAlgorithm<T>, 泛型类T是分片键的字段类型
  4. */
  5. public class TableRangeAlgorithm implements RangeShardingAlgorithm<Long> {
  6. /**
  7. * 范围分片算法:用于处理BETWEEN AND, >, <, >=, <=分片
  8. * @param availableTargetNames - 数据源或者实际表的名字集合
  9. * @param shardingValue - 分片值
  10. * @return 返回分片后的实际表名
  11. */
  12. @Override
  13. public Collection<String> doSharding(Collection<String> availableTargetNames, RangeShardingValue<Long> shardingValue) {
  14. //实现范围查询 cid between 200 and 300 中的上限和下限值
  15. Range<Long> valueRange = shardingValue.getValueRange();
  16. Long lower = valueRange.lowerEndpoint(); //下限值200
  17. Long upper = valueRange.upperEndpoint(); //上限值200
  18. //下面自行实现逻辑判断分片后的实际表名,这里就不具体实现了
  19. return availableTargetNames;
  20. }
  21. }
  •  DB分库策略
  1. /**
  2. * standard分片策略的表精确分片算法实现类
  3. * 实现接口 PreciseShardingAlgorithm<T>, 泛型类T是分片键的字段类型
  4. */
  5. public class DbPreciseAlgorithm implements PreciseShardingAlgorithm<Long> {
  6. /**
  7. * 精确分片算法:用于处理=和IN的分片
  8. * @param availableTargetNames - 数据源或者实际表的名字集合
  9. * @param preciseShardingValue - 包含逻辑表名、分片列和分片列的值
  10. * @return 返回数据源名字
  11. */
  12. @Override
  13. public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
  14. //获取配置的所有数据源名字集合
  15. System.out.println("===> names: "+availableTargetNames);
  16. return null;
  17. }
  18. }
3. complex(复合分片策略) - 根据多个分片键进行精确或者范围分片

对应ComplexKeysShardingAlgorithm,用于处理使用多键作为分片键进行分片的场景,包含多个分片键的逻辑较复杂,需要应用开发者自行处理其中的逻辑,需要配合ComplexShardingStrategy使用。

复合分片算法接口: ComplexKeysShardingAlgorithm

  1. #complex 多个分片键策略, 支持精确和范围分片
  2. #分表策略配置
  3. table-strategy:
  4. complex:
  5. sharding-column: cid, user_id #分片字段, 可以指定多个
  6. algorithm-class-name: cn.demo.strategy.TableComplexAlgorithm
  7. #分库策略配置
  8. database-strategy:
  9. complex:
  10. sharding-column: cid, user_id #分片字段, 可以指定多个
  11. algorithm-class-name: cn.demo.strategy.DbComplexAlgorithm
  1. /**
  2. * complex 多个分片键的分片策略
  3. * 实现接口 PreciseShardingAlgorithm<T>, 泛型类T是分片键的字段类型
  4. */
  5. public class TableComplexAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
  6. /**
  7. * complex 多个分片键的分片算法
  8. *
  9. * @param availableTargetNames - 数据源或者实际表的名字集合
  10. * @param shardingValue - 含逻辑表名、分片列和分片列的值
  11. * @return 返回实际表名集合
  12. */
  13. @Override
  14. public Collection<String> doSharding(Collection<String> availableTargetNames, ComplexKeysShardingValue<Long> shardingValue) {
  15. Collection<String> result = new ArrayList<>();
  16. String logicTableName = shardingValue.getLogicTableName();
  17. //shardingValue.getColumnNameAndShardingValuesMap
  18. //获得分片列名和分片值的对应map
  19. Map<String, Collection<Long>> mp1 = shardingValue.getColumnNameAndShardingValuesMap();
  20. //shardingValue.getColumnNameAndRangeValuesMap
  21. //获得分片列名和分片范围值的对应map
  22. Map<String, Range<Long>> mp2 = shardingValue.getColumnNameAndRangeValuesMap();
  23. return availableTargetNames;
  24. }
  25. }

对于两个分片键的场景,可以采用基因法

在电商场景中,使用订单 ID 和买家 ID 查询数据的问题。在这个场景中,我们选择使用订单 ID 作为分片键是一个没有异议的选择。那么此时,我们通过 APP 来查询自己的订单时,查询条件变为了分片键之外的买家 ID,默认情况下,查询语句中不带有分片键会导致全路由情况。面对这样的情况,应如何设计一个高效的分片策略?

大厂常常使用的方案是基因法,即将买家 ID 融入到订单 ID 中,作为订单 ID 后缀。这样,指定买家的所有订单就会与其订单在同一分片内了,如下图所示

 4. hint策略 - 使用与sql无关的方式进行分片

对应HintShardingStrategy。通过Hint指定分片值而非从SQL中提取分片值的方式进行分片的策略

hint分片算法接口: HintShardingAlgorithm

  1. #hint 片键策略
  2. #分表策略配置
  3. table-strategy:
  4. hint:
  5. algorithm-class-name: cn.demo.strategy.TableHintAlgorithm
  6. #分库策略配置
  7. database-strategy:
  8. hint:
  9. algorithm-class-name: cn.demo.strategy.DbHintAlgorithm
  1. public class TableHintAlgorithm implements HintShardingAlgorithm<Long> {
  2. /**
  3. * Sharding.
  4. *
  5. * <p>sharding value injected by hint, not in SQL.</p>
  6. *
  7. * @param availableTargetNames available data sources or tables's names
  8. * @param shardingValue sharding value,来自hintManager设置的值
  9. * @return sharding result for data sources or tables's names
  10. */
  11. @Override
  12. public Collection<String> doSharding(Collection<String> availableTargetNames, HintShardingValue<Long> shardingValue) {
  13. return null;
  14. }
  15. }

ShardingSphere使用ThreadLocal管理分片键值进行Hint强制路由。可以通过编程的方式向HintManager中添加分片值,该分片值仅在当前线程内生效。 Hint方式主要使用场景:

1.分片字段不存在SQL中、数据库表结构中,而存在于外部业务逻辑。

2.强制在主库进行某些数据操作。

Hint分片算法需要用户实现HintShardingAlgorithm接口,ShardingSphere在进行Routing时,将会从HintManager中获取分片值进行路由操作。

获取HintManager

HintManager hintManager = HintManager.getInstance();

添加分片键值

  • 使用hintManager.addDatabaseShardingValue来添加数据源分片键值。
  • 使用hintManager.addTableShardingValue来添加表分片键值。

分库不分表情况下,强制路由至某一个分库时,可使用hintManager.setDatabaseShardingValue方式添加分片。通过此方式添加分片键值后,将跳过SQL解析和改写阶段,从而提高整体执行效率。

清除分片键值

分片键值保存在ThreadLocal中,所以需要在操作结束时调用hintManager.close()来清除ThreadLocal中的内容。

代码示例

  1. // Sharding database and table with using hintManager.
  2. String sql = "SELECT * FROM t_order";
  3. try (HintManager hintManager = HintManager.getInstance();
  4. Connection conn = dataSource.getConnection();
  5. PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
  6. hintManager.addDatabaseShardingValue("t_order", 1);
  7. hintManager.addTableShardingValue("t_order", 2);
  8. try (ResultSet rs = preparedStatement.executeQuery()) {
  9. while (rs.next()) {
  10. // ...
  11. }
  12. }
  13. }
  14. // Sharding database without sharding table and routing to only one database with using hintManger.
  15. String sql = "SELECT * FROM t_order";
  16. try (HintManager hintManager = HintManager.getInstance();
  17. Connection conn = dataSource.getConnection();
  18. PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
  19. hintManager.setDatabaseShardingValue(3);
  20. try (ResultSet rs = preparedStatement.executeQuery()) {
  21. while (rs.next()) {
  22. // ...
  23. }
  24. }
  25. }

三、SpringBoot 整合 ShardingSphere4.1.1

 1. POM文件引入shardingSphere相关依赖

  1. <!-- mysql驱动 -->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. </dependency>
  6. <!-- mybatis框架 -->
  7. <dependency>
  8. <groupId>org.mybatis.spring.boot</groupId>
  9. <artifactId>mybatis-spring-boot-starter</artifactId>
  10. </dependency>
  11. <!-- druid数据源 -->
  12. <dependency>
  13. <groupId>com.alibaba</groupId>
  14. <artifactId>druid-spring-boot-starter</artifactId>
  15. </dependency>
  16. <!-- sharding-jdbc分库分表 -->
  17. <dependency>
  18. <groupId>org.apache.shardingsphere</groupId>
  19. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  20. <version>4.1.1</version>
  21. </dependency>
  22. <!-- sharding-transaction分布式事务 -->
  23. <dependency>
  24. <groupId>org.apache.shardingsphere</groupId>
  25. <artifactId>sharding-transaction-xa-core</artifactId>
  26. <version>4.1.1</version>
  27. </dependency>

 2. 分表的建表语句

在course数据库下创建两张表course_1, course_2

  1. -- course.course_1 definition
  2. CREATE TABLE `course_1` (
  3. `cid` bigint(20) NOT NULL COMMENT 'ID',
  4. `cname` varchar(100) NOT NULL,
  5. `user_id` varchar(64) NOT NULL,
  6. `cstatus` tinyint(4) NOT NULL,
  7. PRIMARY KEY (`cid`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
  9. -- course.course_2 definition
  10. CREATE TABLE `course_2` (
  11. `cid` bigint(20) NOT NULL COMMENT 'ID',
  12. `cname` varchar(100) NOT NULL,
  13. `user_id` varchar(64) NOT NULL,
  14. `cstatus` tinyint(4) NOT NULL,
  15. PRIMARY KEY (`cid`)
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

 3. yaml配置文件配置sharding分库分表的配置

  • 分表yaml配置
  1. #配置分库分表策略
  2. #配置数据源
  3. spring:
  4. shardingsphere:
  5. props:
  6. sql:
  7. show: true #显示sql语句日志
  8. datasource:
  9. names: m1 #指定一个虚拟数据库名称
  10. m1:
  11. type: com.alibaba.druid.pool.DruidDataSource
  12. driver-class-name: com.mysql.cj.jdbc.Driver
  13. url: jdbc:mysql://127.0.0.1:3306/course?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
  14. username: test
  15. password: 123456
  16. #分表配置, 这里使用主键cid 作为分表字段
  17. sharding:
  18. tables:
  19. course: #指定一个虚拟表名称
  20. actual-data-nodes: m1.course_$->{1..2} #实际使用的表节点, 数据库.表名
  21. key-generator: #主键自动生成策略
  22. column: cid
  23. type: SNOWFLAKE #使用雪花ID
  24. props:
  25. worker:
  26. id: 1
  27. table-strategy: #分表策略
  28. inline: #inline策略
  29. sharding-column: cid #分表字段
  30. algorithm-expression: course_$->{cid%2+1} #分表算法,求模取余算法
  • 分库yaml配置 
  1. #配置分库分表策略
  2. #配置多个数据源
  3. spring:
  4. shardingsphere:
  5. datasource:
  6. names: m1,m2 #指定多个虚拟数据库名称
  7. m1:
  8. type: com.alibaba.druid.pool.DruidDataSource
  9. driver-class-name: com.mysql.cj.jdbc.Driver
  10. url: jdbc:mysql://127.0.0.1:3306/course1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
  11. username: test
  12. password: 123456
  13. m2:
  14. type: com.alibaba.druid.pool.DruidDataSource
  15. driver-class-name: com.mysql.cj.jdbc.Driver
  16. url: jdbc:mysql://127.0.0.1:3306/course2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
  17. username: test
  18. password: 123456
  19. #分库分表配置
  20. sharding:
  21. tables:
  22. course: #指定一个虚拟表名称
  23. actual-data-nodes: m$->{1..2}.course_$->{1..2} #m1.course 数据库.表名
  24. key-generator: #主键自动生成策略
  25. column: cid
  26. type: SNOWFLAKE #使用雪花ID
  27. props:
  28. worker:
  29. id: 1
  30. table-strategy: #分表策略
  31. inline: #inline策略
  32. sharding-column: cid #分表字段
  33. algorithm-expression: course_$->{cid%2+1} #分表算法,求模取余算法
  34. database-strategy: #分库策略
  35. inline: #inline策略
  36. sharding-column: user_id #分库字段
  37. algorithm-expression: m$->{user_id % 2 + 1} #分库算法,求模取余算法

4.  启动类上移除Druid数据源的自动配置

  1. @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class )
  2. public class ShardingsphereApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(ShardingsphereApplication.class, args);
  5. }
  6. }

5. 插入测试数据

正常使用mapper接口进行数据插入即可

  1. @Service
  2. public class CourseService {
  3. @Autowired
  4. private CourseMapper courseMapper;
  5. @PostConstruct
  6. private void init() {
  7. this.insert();
  8. }
  9. public void insert() {
  10. for (int i=1;i<=10;i++) {
  11. Course c = new Course(null, "汤姆"+i, "tom"+i, 1);
  12. courseMapper.insert(c);
  13. }
  14. }
  15. }
插入结果:

course_1表

 course_2表

四、ShardingSphere实现分布式事务控制

引入Maven依赖

  1. <dependency>
  2. <groupId>org.apache.shardingsphere</groupId>
  3. <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
  4. <version>${shardingsphere.version}</version>
  5. </dependency>
  6. <!-- 使用XA事务时,需要引入此模块 -->
  7. <dependency>
  8. <groupId>org.apache.shardingsphere</groupId>
  9. <artifactId>sharding-transaction-xa-core</artifactId>
  10. <version>${shardingsphere.version}</version>
  11. </dependency>
  12. <!-- 使用BASE事务时,需要引入此模块 -->
  13. <dependency>
  14. <groupId>org.apache.shardingsphere</groupId>
  15. <artifactId>sharding-transaction-base-seata-at</artifactId>
  16. <version>${sharding-sphere.version}</version>
  17. </dependency>

 ShardingSphere要实现事务控制需要手动声明一个PlatformTransactionManager事务管理器Bean,否则事务不会生效。还要将ShardingDataSource 数据源注入到事务管理器中。

  1. /**
  2. * 事务管理器中注入Sharding数据源 ShardingDataSource
  3. */
  4. @Bean
  5. @Primary
  6. public PlatformTransactionManager platformTransactionManager(ShardingDataSource shardingDataSource) {
  7. PlatformTransactionManager manager = new DataSourceTransactionManager(shardingDataSource);
  8. return manager;
  9. }

后续使用注解@EnableTransactionManagement开启事务,注解@Transactional标注在需要事务控制的方法上。

  1. @Transactional
  2. @ShardingTransactionType(TransactionType.XA) // 支持TransactionType.LOCAL, TransactionType.XA, TransactionType.BASE
  3. public void insert() {
  4. jdbcTemplate.execute("INSERT INTO t_order (user_id, status) VALUES (?, ?)", (PreparedStatementCallback<Object>) preparedStatement -> {
  5. preparedStatement.setObject(1, i);
  6. preparedStatement.setObject(2, "init");
  7. preparedStatement.executeUpdate();
  8. });
  9. }

Sharding支持事务类型TransactionType.LOCAL, TransactionType.XA, TransactionType.BASE 

本文参考shardingsphere官网网站文档

使用手册 :: ShardingSphere

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/210869
推荐阅读
相关标签
  

闽ICP备14008679号