Sharding-JDBC分库分表-分布式事务-5

news2024/11/26 23:48:13

分布式事务

Sharding JDBC事务介绍

分库分表必然会涉及到分布式事务的问题,关于这方面,sharding JDBC为用户提供了两种分布式事务解决方案:XA事务和BASE事务,这两个的区别是:XA事务,追求强一致性,锁定的资源范围比较大,是个并发量要求不高、事务锁定时间短的场景;而BASE事务是一种柔性事务,它追求的是最终一致性,对资源锁定范围小,适合高并发的场景。

关于sharding JDBC分布式事务的介绍见官方介绍:sharding JDBC分布式事务介绍

XA事务实践

XA 事务采用的是 X/OPEN 组织所定义的 DTP 模型 所抽象的 AP(应用程序), TM(事务管理器)和 RM(资源管理器) 概念来保证分布式事务的强一致性。 其中 TM 与 RM 间采用 XA 的协议进行双向通信,通过两阶段提交实现。 与传统的本地事务相比,XA 事务增加了准备阶段,数据库除了被动接受提交指令外,还可以反向通知调用方事务是否可以被提交。 TM 可以收集所有分支事务的准备结果,并于最后进行原子提交,以保证事务的强一致性。

在这里插入图片描述

XA 事务建立在 ShardingSphere 代理的数据库 xa start/end/prepare/commit/rollback/recover 的接口上。

对于一条逻辑 SQL,ShardingSphere 通过 xa begin 指令在每个被代理的数据库开启事务,内部集成 TM,用于协调各分支事务,并执行 xa commit/rollback

基于 XA 协议实现的分布式事务,由于在执行的过程中需要对所需资源进行锁定,它更加适用于执行时间确定的短事务。 对于长事务来说,整个事务进行期间对数据的独占,将会对并发场景下的性能产生一定的影响。

XA 事务的实现有以下几种

  • Atomikos事务
  • Narayana事务
  • Bitronix事务

下面以Atomikos事务为例,结合前面的章节进行实践

引入依赖

官方参考:基于SpringBoot的XA事务依赖

<!-- 使用 XA 事务时,需要引入此模块 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-transaction-xa-core</artifactId>
    <version>5.2.1</version>
</dependency>
<!-- 解决启动报错问题 -->
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions</artifactId>
    <version>5.0.9</version>
</dependency>
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jta</artifactId>
    <version>5.0.9</version>
</dependency>
<dependency>
    <groupId>com.atomikos</groupId>
    <artifactId>transactions-jdbc</artifactId>
    <version>5.0.9</version>
</dependency>


额外引入的atomikos依赖是因为shardingsphere-transaction-xa-core启动时会报错:

java.lang.AbstractMethodError: com.atomikos.icatch.jta.JtaTransactionServicePlugin.beforeInit()V

事务配置

首先需要使用Java配置类对事务管理器PlatformTransactionManager和JdbcTemplate进行bean初始化

@Configuration
@EnableTransactionManagement
public class TransactionConfiguration {
    
    @Bean
    public PlatformTransactionManager txManager(final DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    
    @Bean
    public JdbcTemplate jdbcTemplate(final DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

然后再配置文件中配置

spring:
  shardingsphere:
    props:
      xa-transaction-manager-type: Atomikos

使用分布式事务

使用的时候很简单,只用在处理分布式事务的方法上加注解@ShardingSphereTransactionType(TransactionType.XA)

@Autowired
private IOrderMapper mapper;

@Test
@Transactional
@ShardingSphereTransactionType(TransactionType.XA)
public void addOrderWithError() {
    for (int i = 0; i < 20; i++) {
        OrderPo orderPo = JMockData.mock(OrderPo.class);
        orderPo.setOrderId((long) i);
        orderPo.setStatus(1);
        orderPo.setDeleted(0);
        Faker faker = new Faker();
        Calendar fromDate = Calendar.getInstance();
        fromDate.set(2023, Calendar.JANUARY, 1);
        Calendar toDate = Calendar.getInstance();
        toDate.set(2024, Calendar.DECEMBER, 31); // 故意超出时间范围,使其报错
        orderPo.setOrderDate(faker.date().between(fromDate.getTime(), toDate.getTime()));
        log.info("add new order:{}", orderPo);
        mapper.insert(orderPo);
    }
}

运行用例,部分数据可以插入,部分数据会报错,如下图:

在这里插入图片描述

对于部分成功的数据查询数据库并没有入库,说明分布式事务进行了回滚,所以分布式事务生效了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

udev自动创建设备节点的机制

流程框图如下 自动创建 1 内核检测到设备插入后&#xff0c;会发送一个uevent事件到内核中&#xff0c;并提供有关硬件设备的信息。 2 udevd守护程序收到uevent事件后&#xff0c;创建一个设备类&#xff0c;&#xff08;向上提交目录信息&#xff09;&#xff0c;会在内核中…

道路交通资产管理体系实施指南

声明 本文是学习GB-T 42932-2023 道路交通资产管理体系实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 7 支持 7.1 资源 组织宜确定并提供建立、实施、保持和持续改进资产管理体系所需的资源&#xff0c;包括人力、财力、物质、技 术、知…

Java8实战-总结26

Java8实战-总结26 用流收集数据分组多级分组按子组收集数据 用流收集数据 分组 一个常见的数据库操作是根据一个或多个属性对集合中的项目进行分组。就像前面讲到按货币对交易进行分组的例子一样&#xff0c;如果用指令式风格来实现的话&#xff0c;这个操作可能会很麻烦、啰…

ABB PP846 3BSE042238R1触摸屏模块

ABB PP846 3BSE042238R1是一款触摸屏模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;以提供人机界面&#xff08;HMI&#xff09;功能&#xff0c;允许操作员与控制系统进行交互和监控。以下是一些可能的产品功能和功能&#xff0c;但请注意&#xff0c;具体的功能…

win10一进桌面就全部黑屏了 win10开机黑屏怎么办

在使用Windows 10的过程中&#xff0c;我们会遇到许多问题&#xff0c;但它们都不会像黑屏那样烦人&#xff0c;因为黑屏时不会收到任何错误代码或消息&#xff0c;提示我们从何处开始进行故障排除。 在Windows 10操作系统中&#xff0c;出现黑屏可能有多种原因&#xff0c;它…

性能测试度量指标

1-响应时间 响应时间指从用户或事务在客户端发起一个请求开始&#xff0c;到客户端接收到从服务器端返回的响应结束&#xff0c;这整个过程所消耗的时间 在性能测试实践中&#xff0c;为了使响应时间更具代表性&#xff0c;响应时间通常是指事务的平均响应时间ART 在实践中要…

力扣刷题-移除指定值的链表元素

力扣203移除元素 题目来源&#xff1a; 力扣203 题目描述&#xff1a; 非常简单的一道题&#xff0c;主要强调两点 链表删除要记录删除位置的前驱节点 头节点没有前驱 因此直接headhead.next为了保持与后两种一致&#xff0c;加上虚拟节点&#xff0c;下一节点指向头节点 /***…

Java 复习笔记 -学生管理系统进阶篇

文章目录 学生管理系统进阶版一&#xff0c;需求部分&#xff08;一&#xff09;需求&#xff08;二&#xff09;分析1&#xff0c;登录界面2&#xff0c;用户类3&#xff0c;注册功能4&#xff0c;登录功能5&#xff0c;忘记密码6&#xff0c;验证码规则 二&#xff0c;实现部…

【具身智能】RT-2:视觉-语言-动作模型(VLA)

文章目录 前言一、视觉-语言-动作(VLA)模型二、利用 VLM 控制机器人三、实验四、 Demo五、总结前言 Robotic Transformer 2(RT-2)是由谷歌 DeepMind 新推出的大语言模型,它为人类提供了通过纯语言命令来优化机器人控制的能力。与此前的大模型不同,RT-2是一种新型的视觉-…

使用C语言EasyX 创建动态爱心背景

简介 在计算机图形学的世界中&#xff0c;有很多方法可以使程序的界面更加吸引人。在本篇博客中&#xff0c;我将向大家介绍如何使用 EasyX 图形库在 C 中创建一个动态的爱心背景。这不仅是一个简单的动画效果&#xff0c;它还包括背景的星星、旋转的心形以及一个美观的背景渐…

Scrapy爬虫框架实战

Python实现爬虫是很容易的&#xff0c;一般来说就是获取目标网站的页面&#xff0c;对目标页面的分析、解析、识别&#xff0c;提取有用的信息&#xff0c;然后该入库的入库&#xff0c;该下载的下载。以前写过一篇文章《Python爬虫获取电子书资源实战》&#xff0c;以一个电子…

Vite+React+Electron开发入门,10分钟搭建本地环境并打包

前言 想使用vite和react开发跨平台桌面的软件方案有electron和tauri两种&#xff0c;但是我个人更喜欢tauri&#xff0c;无奈electron名声大燥&#xff0c;面试要求里很多都写着&#xff1a;electron...可见这类公司多么落后。但是呢&#xff0c;又秉持着存在即合理的理念&…

Android 12 源码分析 —— 应用层 五(SystemUI的StatusBar类的启动过程和三个窗口的创建)

Android 12 源码分析 —— 应用层 五&#xff08;SystemUI的StatusBar类的启动过程和三个窗口的创建&#xff09; 在前面的文章中&#xff0c;我们介绍了SystemUI App的基本布局和基本概念。接下来&#xff0c;我们进入SystemUI应用的各个UI是如何被加入屏幕的。那么我们就先从…

计算机视觉实战项目(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别)

图像分类 教程博客_传送门链接:链接 在本教程中&#xff0c;您将学习如何使用迁移学习训练卷积神经网络以进行图像分类。您可以在 cs231n 上阅读有关迁移学习的更多信息。 本文主要目的是教会你如何自己搭建分类模型&#xff0c;耐心看完&#xff0c;相信会有很大收获。废话不…

Linux——Shell脚本编程(1)

一、为什么要学习 Shell 编程 &#xff1f; 1)Linux运维工程师在进行服务器集群管理时&#xff0c;需要编写Shell程序来进行服务器管理。 2)对于 JavaEE 和 Python 程序员来说&#xff0c;工作的需要&#xff0c;要求你编写一些 Shell脚本进行程序或者是服务器的维护&#xff…

【Linux学习笔记】基础命令2

1. rmdir指令 && rm指令1.1. 基础概念1.2. 命令用法1.2.1. rmdir命令1.2.2. rm命令1.2.3. rm命令的注意事项 2. man命令3. cp指令3.1. cp指令基础概念3.2. cp命令的用法 4. mv命令5. cat命令6. more命令 && less命令6.1. more命令6.2. less命令 7. head命令和t…

C#下使用IronPython来实现热更新

问题 之前我们学习过Roslyn&#xff0c;他可以动态编译代码并运行&#xff0c;然后通过ALC加载即插即用&#xff0c;但是遇到一些问题感觉无法解决&#xff0c;我编写一个类A在ALC中&#xff0c;另外一个类B要实例化这个A&#xff0c;我想让他们都能灵活卸载&#xff0c;但是如…

MySQL与ES数据同步的四种方案及实践演示

文章目录 一、同步双写优点缺点双写失败风险项目演示 二、异步双写&#xff08;MQ方式&#xff09;优点缺点项目演示 三、基于Datax同步核心组件架构图支持的数据源及操作项目演示 四、基于Binlog实时同步实现原理优点缺点项目演示 一、同步双写 也就是同步调用&#xff0c;这…

IPIDEA动态代理IP更适合于哪些业务场景?为什么动态代理IP更经济实惠?

动态代理IP是一种非常有用的工具&#xff0c;在许多业务场景中发挥重要作用。动态代理IP可以帮助用户提高网络速度和稳定性&#xff0c;提高工作效率&#xff0c;对于需要进行跨境业务的企业和个人来说尤为重要。 让我们先来看看动态代理IP更适合于哪些业务场景。 1.数据采集…

StraUML的详细使用步骤

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于JRebel & XRebel的相关操作吧 下载和安装&#xff1a;首先&#xff0c;你需要从StarUML的官方网站或适用于你操作系统的应用商店下载并安装StarUML软件Sta…