官网解释:

功能

  • 支持数据分片后的跨库XA事务
  • 两阶段提交保证操作的原子性和数据的强一致性
  • 服务宕机重启后,提交/回滚中的事务可自动恢复
  • SPI机制整合主流的XA事务管理器,默认Atomikos,可以选择使用Narayana和Bitronix
  • 同时支持XA和非XA的连接池
  • 提供spring-boot和namespace的接入端

不支持项

  • 服务宕机后,在其它机器上恢复提交/回滚中的数据

一、准备环境:

ps:两个order_db分布在不同的服务器上,192.168.87.133节点的order_db库中有三张表,t_dict,t_order_1,t_order_2,192.168.87.134节点上的order_db库中有两张表,t_order_1,t_order_2。

二、(三)Sharding-JDBC 整合mybatis-plus 水平分库、分表改造

application.yml:

#服务端口
server:port: 56081
#服务名
spring:application:name: sharding-jdbc-exampleshttp:encoding:enabled: truecharset: utf-8force: truemain:allow-bean-definition-overriding: true#shardingsphere相关配置shardingsphere:datasource:names: m1,m2   #配置库的名字,随意m1:   #配置目前m1库的数据源信息type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.87.133:3306/order_db?useUnicode=trueusername: rootpassword: 123456m2:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.87.134:3306/order_db?useUnicode=trueusername: rootpassword: 123456sharding:tables:t_order:key-generator:column: user_idtype: SNOWFLAKEactual-data-nodes: m$->{1..2}.t_order_$->{1..2}   # 分库策略,以user_id为分片键,分片策略为user_id % 2 + 1,user_id为偶数操作m1数据源,否则操作m2。database‐strategy:  #分库策略inline:sharding‐column: user_idalgorithm‐expression: m$->{user_id % 2 + 1}table‐strategy: #分表策略inline:sharding‐column: order_idalgorithm‐expression: t_order_$->{order_id % 2 + 1}defaultDataSourceName: m1props:sql:show: true   #打印sql#日志打印
logging:level:root: infoorg.springframework.web: infocom.lucifer.sharding.dao: debugdruid.sql: debug

ps:由于t_dist这张表只出现在192.168.87.133这个服务器节点的order_db库中,因此需要配置属性defaultDataSourceName,设置默认数据库。否则会出现找不到数据库名为null的数据库名。

测试方法:t_dict这个表只存在192.168.87.133的order_db库中的,而t_order_*这个存在于两个库中,既有分库策略也有分表策略。

  @Testpublic void add() {Dict dict = new Dict();dict.setCode("111");dict.setType("性别");dict.setValue("男");dictDao.insert(dict);//伪造异常int a=1/0;Order order = new Order();order.setPrice(BigDecimal.valueOf(0.1));order.setStatus("0");orderDao.insert(order);}

1.首先看下未使用事务的情况:

2020-01-19 10:30:36.538  INFO 6980 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_dict   (dict_id, code, type, value) VALUES (?, ?, ?, ?) ::: [1218722393623670785, 111, 性别, 男]
2020-01-19 10:30:36.572 DEBUG 6980 --- [           main] com.lucifer.sharding.dao.DictDao.insert  : <==    Updates: 1java.lang.ArithmeticException: / by zeroat com.lucifer.sharding.ShardingJdbcExamplesApplicationTests.add(ShardingJdbcExamplesApplicationTests.java:33)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)

控制台输出,可以看出在执行完m1库(192.168.87.133的order_db库中的t_dict)sql操作完后,报错。因此这个时候只有一条sql执行了。数据未回滚。

2.使用事务的情况

   2.1.pom.xml:引入两个jar包

        <dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-2pc-xa</artifactId><version>3.1.0</version></dependency><dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-spring</artifactId><version>3.1.0</version></dependency>

或使用下面这个jar包

        <dependency><groupId>io.shardingsphere</groupId><artifactId>sharding-transaction-spring-boot-starter</artifactId><version>3.1.0</version></dependency>

 2.2.springboot主配置类的SpringBootApplication注解去掉JtaAutoConfiguration这个配置类这个注入。

/*** @author Lucifer*/
@MapperScan("com.lucifer.sharding.dao")
@SpringBootApplication(exclude = JtaAutoConfiguration.class)
public class ShardingJdbcExamplesApplication {public static void main(String[] args) {SpringApplication.run(ShardingJdbcExamplesApplication.class, args);}}

 2.3测试方法: @ShardingTransactionType(value = TransactionType.XA)

                           @Transactional(rollbackFor =Exception.class) 两个注解需要配合使用。

    @ShardingTransactionType(value = TransactionType.XA)@Transactional(rollbackFor = Exception.class)@Testpublic void add() {Dict dict = new Dict();dict.setCode("111");dict.setType("性别");dict.setValue("男");dictDao.insert(dict);int a=1/0;Order order = new Order();order.setPrice(BigDecimal.valueOf(0.1));order.setStatus("0");orderDao.insert(order);}

控制台输出: 

2020-01-19 10:55:36.735  INFO 4660 --- [           main] ShardingSphere-SQL                       : Actual SQL: m1 ::: INSERT INTO t_dict   (dict_id, code, type, value) VALUES (?, ?, ?, ?) ::: [1218728685880786946, 111, 性别, 男]
2020-01-19 10:55:36.757 DEBUG 4660 --- [           main] com.lucifer.sharding.dao.DictDao.insert  : <==    Updates: 1
2020-01-19 10:55:36.776  INFO 4660 --- [           main] o.s.t.c.transaction.TransactionContext   : Rolled back transaction for test: [DefaultTestContext@563e4951 testClass = ShardingJdbcExamplesApplicationTests, testInstance = com.lucifer.sharding.ShardingJdbcExamplesApplicationTests@278fe428, testMethod = add@ShardingJdbcExamplesApplicationTests, testException = java.lang.ArithmeticException: / by zero, mergedContextConfiguration = [WebMergedContextConfiguration@4066c471 testClass = ShardingJdbcExamplesApplicationTests, locations = '{}', classes = '{class com.lucifer.sharding.ShardingJdbcExamplesApplication, class com.lucifer.sharding.ShardingJdbcExamplesApplication}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true}', contextCustomizers = set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@140c9f39, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@7690781, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@be35cd9, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@193f604a], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]], attributes = map['org.springframework.test.context.web.ServletTestExecutionListener.activateListener' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.populatedRequestContextHolder' -> true, 'org.springframework.test.context.web.ServletTestExecutionListener.resetRequestContextHolder' -> true]]java.lang.ArithmeticException: / by zeroat com.lucifer.sharding.ShardingJdbcExamplesApplicationTests.add(ShardingJdbcExamplesApplicationTests.java:39)

数据库t_dict也回滚了

测试异常在后的情况:

    @ShardingTransactionType(value = TransactionType.XA)@Transactional(rollbackFor = Exception.class)@Testpublic void add() {Dict dict = new Dict();dict.setCode("111");dict.setType("性别");dict.setValue("男");dictDao.insert(dict);Order order = new Order();order.setPrice(BigDecimal.valueOf(0.1));order.setStatus("0");orderDao.insert(order);int a=1/0;}

根据控制台输出,知道t_dict执行成功, 而order的数据库操作最终是落在m2库的t_order_1表中。

2020-01-19 11:13:13.146 DEBUG 11876 --- [           main] com.lucifer.sharding.dao.DictDao.insert  : ==>  Preparing: INSERT INTO t_dict ( dict_id, code, type, value ) VALUES ( ?, ?, ?, ? )
2020-01-19 11:13:13.164 DEBUG 11876 --- [           main] com.lucifer.sharding.dao.DictDao.insert  : ==> Parameters: 1218733118769360898(Long), 111(String), 性别(String), 男(String)2020-01-19 11:13:19.666  INFO 11876 --- [           main] ShardingSphere-SQL                       : Actual SQL: m2 ::: INSERT INTO t_order_1   (order_id, price, status, user_id) VALUES (?, ?, ?, ?) ::: [1218733137404653570, 0.1, 0, 425612793970950145]
2020-01-19 11:13:21.182 DEBUG 11876 --- [           main] c.lucifer.sharding.dao.OrderDao.insert   : <==    Updates: 1

 查看数据库发现均回滚了。

【Sharding-JDBC】 (五)整合mybatis-plus 解决分布式事务(基于XA)相关推荐

  1. SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务

    作者:请叫我东子 https://blog.csdn.net/u010046908/article/details/100536439 1.简介"本文主要介绍SpringBoot2.1.5 ...

  2. SpringBoot整合Mybatis,并实现事务控制

    SpringBoot整合Mybatis,并实现事务控制 1. 在pom文件里添加相关maven文件 <parent><groupId>org.springframework.b ...

  3. 解决分布式事务,Seata真香

    目录 背景介绍 什么是分布式事务 什么叫做逆向补偿呢 互联网最流行的分布式事务组件seata 总结 背景 大家好,今天给大家分享一个在 2022 年出去面试 Java 几乎必问的一个技术,那就是 se ...

  4. rabbitmq 查询版本_基于rabbitmq解决分布式事务

    分布式事务要解决的问题是保证二个数据库数据的一致性,本地事务ACID属于刚性事务,基于CAP理论,分布式事务的核心要点柔性事务,最终一致性. 基于rabbitmq解决分布式事务要点如下 生产者采用发送 ...

  5. 搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务

    搞懂分布式技术19:使用RocketMQ事务消息解决分布式事务 初步认识RocketMQ的核心模块 rocketmq模块 rocketmq-broker:接受生产者发来的消息并存储(通过调用rocke ...

  6. 分布式事务 - 如何解决分布式事务问题?

    分布式事物 - 如何解决分布式事务问题? 面试题 分布式事务了解吗?你们是如何解决分布式事务问题的? 面试官心理分析 只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑, ...

  7. RocketMQ如何解决分布式事务

    本文来说下RocketMQ如何解决分布式事务 文章目录 基本实现思路 RocketMQ的事务消息状态 代码实例 maven导入 yaml文件配置 核心代码 本文小结 基本实现思路 核心思想:事务消息总 ...

  8. ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例

    ShardingSphere RAW JDBC 分布式事务 Narayana XA 代码示例 项目工程在:transaction-2pc-narayana-xa-raw-jdbc-example 代码 ...

  9. 基于消息中间件解决分布式事务的开源框架Myth

    基于消息中间件的解决分布式事务框架:https://github.com/yu199195/myth 1.rpc框架支持 : dubbo,motan,springcloud. 2.消息中间件支持 : ...

  10. 使用Seata解决分布式事务以及Seata的安装、配置和使用

    目录 事务的介绍 什么是本地事务? 分布式事务 分布式事务解决方案之seata Seata介绍 Seata是什么 Seata的分布式事务解决方案 Seata的核心组件 AT模式的工作流程 一阶段 二阶 ...

最新文章

  1. ajax request headers,ajax request VS normal request
  2. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
  3. Algorithm-Gossip(4) 三色棋(Three_Color_Flag)
  4. 23岁研究生校内坠亡!家人称导师经常辱骂讽刺他,事件涉及两所高校!
  5. mysql frm 英文全称_FRM考试是中文还是英文?
  6. 函数指针的定义和函数指针数组
  7. iframe中的右键 禁止_网站排名优化中必须要注意的事项
  8. 热释电传感器三个引脚_智能家居组件漫谈——人体传感器
  9. 计算机报名中的照片审核总不过,软考报名时,照片审核难通过怎么办?
  10. 电磁场理论复习笔记-第一章(上)
  11. 10分钟健身法读书笔记(2/5)
  12. 南方都市报:红心照耀MSN
  13. Windows常用Dos命令详解_被迫流浪者的博客
  14. filebeat7.7.0相关详细配置预览- Filebeat inputs
  15. APP - 查询全国医院各科室排行榜(二)
  16. pip install pycrypto
  17. 【渝粤教育】电大中专Office办公软件 (2)_1作业 题库
  18. omnet++,veins,sumo使用多应用层实现车辆和行人的模拟
  19. 谷歌商店上架流程_Googleplay 上架流程(2022版)
  20. DevOps是什么鬼?

热门文章

  1. 华科_图形学笔记_05_初探造型技术_02
  2. 细说促销(淘宝销售可看)
  3. html5 3d引擎 星空,使用3D引擎threeJS实现星空粒子移动效果
  4. jmeter计算测试QPS
  5. iqn怎么查 linux_Linux下配置iscsi-initiator - 存储资源
  6. QT:为图片加当前系统时间水印
  7. my read law / notarization / gongzheng
  8. 项目进度没有把控好,被领导足足骂了10多分钟,吭都不敢吭一声
  9. 【巨人的肩膀上制造世界】——10——Unity3D实用插件之Vectrosity,轻松便捷的实现2D/3D画线功能
  10. 干支纪年法简便算法_初中阶段常用的四种历史纪年法