分库分表ShardingSphere<三> _ 分布式事务

2023-11-14

目录

一、分布式事务

1. LOCAL事务

2. XA事务

3. BASE事务(柔性事务)

二、示例

1. 依赖jar包

2. 配置XA事务

3. 使用XA事务

三、参考资料


一、分布式事务

        ShardingSphere提供三种事务类型:LOCAL(默认)、XA 和 BASE。见枚举类org.apache.shardingsphere.transaction.core.TransactionType。

1. LOCAL事务

支持:单库事务(可分表);因逻辑异常导致的跨库事务(如:同一事务中,跨两个库更新。更新完毕后,抛出空指针,则两个库都能够回滚)

不支持:因网络、硬件异常导致的跨库事务。如:同一事务中,跨两个库更新,更新完毕后、未提交之前,第一个库宕机,则只有第二个库数据提交,且无法回滚。

2. XA事务

        Shardingsphere整合Atomikos对XA分布式事务的支持。XA事务,属于两阶段提交事务。如下图所示。

支持:跨库事务;两阶段提交保证操作的原子性和数据的强一致性;服务宕机重启后,提交/回滚中的事务可自动恢复;支持XA 和非XA的连接池

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

1):两阶段提交

AP(Application Program _ 应用程序):用于定义事务边界(即定义事务的开始和结束),并且在事务边界内对资源进行操作。
RM(Resource Manager _ 资源管理器):如数据库、文件系统等,并提供访问资源的方式。
TM(Transaction Manager _ 事务管理器):事务协调者,负责分配事务唯一标识,监控事务执行进度,并负责事务的提交、回滚等。 

XA二阶段提交:

  • 阶段一:TM通知各个RM准备提交它们的事务分支。如果RM判断自己的工作可以被提交(进行持久化),再给TM肯定答复;其中一个RM有异常情况时,TM对所有RM都是回滚。在发送了否定答复并回滚之后,RM就可以丢弃这个事务分支信息。
  • 阶段二:TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。如果所有的RM都prepare成功,那么TM通知所有的RM进行提交;如果有RM prepare失败的话,则TM通知所有RM回滚自己的事务分支。

2):MySQL的XA事务状态

  • xa_start:在RM端调用时开启一个XA事务,后面需要接上XID作为参数
  • xa_end:取消当前线程与事务的关联,与xa_start是配对使用
  • xa_prepare:询问RM是否已经准备好了提交事务
  • xa_commit:通知RM提交事务分支
  • xa_rollback:通知RM提交回滚事务分支 

3. BASE事务(柔性事务)

        BASE事务,属于柔性事务,数据最终一致性。如下图所示。ShardingSphere集成了SEATA作为柔性事务的使用方案。

支持:跨库事务;支持RC隔离级别;undo快照进行事务回滚;服务宕机后的,自动恢复提交中的事务

不支持:不支持除RC之外的隔离级别

  • 同步送达:sql在执行前记录日志,如果执行成功,把日志删除;如果执行失败,重试一定次数(如果未达到最大尝试次数便执行成功了,一样删除日志)。
  • 异步送达:异步任务不断扫描执行日志,如果重试次数未达到最大上限,尝试重新执行;如果执行成功,删除日志。 

二、示例

1. 依赖jar包

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-transaction-xa-core</artifactId>
    <version>4.1.1</version>
</dependency>

2. 配置XA事务

package com.common.instance.test.config.transaction;

import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

/**
 * @description 分布式事务XA配置
 * @author tcm
 * @version 1.0.0
 * @date 2021/12/15 16:44
 **/
@Component
@EnableTransactionManagement
public class ShardingTransactionXAConfig {

    // TM配置
    @Bean
    public PlatformTransactionManager txManager(final DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    // RM配置
    @Bean
    public JdbcTemplate jdbcTemplate(final DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

}

3. 使用XA事务

注意:@Transactional与@ShardingTransactionType一起使用,而且需要设置事务类型,参考枚举类org.apache.shardingsphere.transaction.core.TransactionType。

@Transactional
@ShardingTransactionType(TransactionType.XA)
@Override
public void testTransactionXA() {
    // 获取分布式主键
    String tabId = getRedisId();

    // 组装对象
    WcPendantTabDetail wcPendantTabDetail = getWcPendantTabDetail(tabId);
    WcPendantTabExtend wcPendantTabExtend = getWcPendantTabExtend(wcPendantTabDetail);

    // 保存DB
    int detail = wcPendantTabDetailDao.insert(wcPendantTabDetail);
    LogUtil.info(String.format("insert wcPendantTabDetail: %s", detail));

    Long.parseLong("adfg");

    int extend = wcPendantTabExtendDao.insert(wcPendantTabExtend);
    LogUtil.info(String.format("insert wcPendantTabExtend: %s", extend));
}

三、参考资料

XA 事务 :: ShardingSphere

ShardingSphere的分布式事务 - 天宇轩-王 - 博客园

sharding-jdbc事务解读_yanyan19880509的专栏-CSDN博客_shardingjdbc 事务

Shardingsphere整合Atomikos对XA分布式事务的支持(2)_ShardingSphere官微-CSDN博客

atomikos分布式事务_Shardingsphere整合Atomikos对XA分布式事务的支持(1)_孔钧的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分库分表ShardingSphere<三> _ 分布式事务 的相关文章

随机推荐

  • 基于视觉的捡球机器人

    机器人通过自带的摄像头对散落在地上的乒乓球进行识别 随后进行拾取 本作品的主要难度在于如何在复杂的背景中准确地识别到乒乓球并跟踪 以及在识别到乒乓球后如何使机器人准确的向乒乓球运行 程序的链接http yueqiuchen blog 163
  • 五、pikachu之RCE

    文章目录 1 RCE概述 2 exec ping 3 exec evel 4 连接符 1 RCE概述 RCE emote command code execute 可以让攻击者直接向后台服务器远程注入操作系统命令或者代码 从而控制后台系统
  • 算法——因子和阶乘

    题目描述 输入正整数n 2 lt n lt 100 把阶乘n 1x2x3x xn分解成素因子相乘的形式 从小到大输出各个素数 2 3 5 的指数 你的程序应忽略比最大素因子更大的素数 否则末尾会有无穷对个0 样例输入 5 53 样例输出 5
  • 跨域问题的原理分析

    一 什么是跨域 当页面来源url 的协议 域名 端口 跟页面发出请求获取后端数据的url 的协议 域名 端口 只有要一个不同时 即为跨域 举个例子 我当前先请求blog csdn net nav lang到csdn服务器获取到一个csdn的
  • Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServer

    错误原因 SpringApplication run 中的类名书写错误 应该是写成springboot启动类的类名而不是其他的 如下所示 我启动类的类名为Main 那么在run方法中应该为Main class而不是其它 SpringBoot
  • RxPermissions简单使用

    RxPermissions简单使用 描述 随着社会的发展人们也开始重视对隐私的保护 谷歌也在Android6 0 sdk 23 增加了动态权限申请来保护广大用户的隐私 使我们开发者实现起来会很繁琐 代码量也会增多 但是对于程序员来说永远都是
  • JWT 身份认证优缺点分析以及常见问题解决方案

    JWT 身份认证优缺点分析以及常见问题解决方案 之前分享了一个使用 Spring Security 实现 JWT 身份认证的 Demo 文章地址 适合初学者入门 Spring Security With JWT 的 Demo Demo 非常
  • javascript基础第二天笔记

    JavaScript 基础 第2天 理解什么是流程控制 知道条件控制的种类并掌握其对应的语法规则 具备利用循环编写简易ATM取款机程序能力 运算符 语句 综合案例 运算符 算术运算符 数字是用来计算的 比如 乘法 除法 加法 减法 等等 所
  • Neo4j使用系列4

    Part4 1 Cypher基础1 类似于关系数据库中使用的SQL 是Neo4j使用的查询语言 1 特点 是一种声明式图形查询语言 富有表现力和高效的查询 更新和管理 设计简单 但功能强大 可以轻松表达高度复杂的数据库查询 Cypher的结
  • MySQL和Oracle时间取整

    按每15分钟时间取整 mysql SELECT now interval TIME TO SEC now mod 900 second from dual 其中now 可以替换为 你自己的 字段 oracle select sysdate
  • 第三方库(wordcloud为例)调用出现种种问题

    刚刚学习了python 想做点小东西练练手 python有很多好玩的东西 turtle库 wordcloud等等一系列我觉得都可以用来练练手并且真的是挺好玩 本来寻思也就十多行代码 肯定一会就能调试完 没想到 真的是我太天真 本来就不怎么会
  • 笔记本拓展外接显示器时 鼠标移动不到主显示器外的另一块屏上

    原因 显示面板 两个显示器图形表示 如下图带有标号的方块 摆放顺序不正确 把代表左边显示器的图标拖动到左侧即可
  • 从零到熟练编写LaTex数学公式,这两篇就够了

    第一篇 LaTex公式编辑方法 快速手敲一遍 熟悉常用操作 第二篇 CSDN官方参考文档 有不清楚的 随手查阅 在线公式编辑 实在打不出 就在线编辑吧
  • R语言系统教程(一):向量及其相关操作

    R语言系统教程 一 向量及其相关操作 前言 1 1 向量 Vector 赋值 1 10 4 5 6 3 1 6 4 21 7 运算 常用函数 1 2 Generate常用向量 Vector 等差数列 等间隔函数 重复函数 1 3 逻辑向量
  • coco 输出格式,MPII 输出格式,标注

    pose 1 数据集 coco 输出格式 MPII 输出格式 代码 详解 1 2 blobFromImage函数 1 数据集 BODY25 COCO MPI coco 输出格式 鼻子 0 颈部 1 右肩 2 右肘 3 右手腕 4 左肩 5
  • 阿里无影云电脑 试用评测

    总有些一些项目需要在家里和公司两头做 不管是用 svn git 云盘同步 还是U盘拷贝都是很麻烦的 背笔记本更累 以前一直想买个挂机宝 但那玩意的配置实在是低 又想说买个云电脑 玩游戏的那种 但价格贵的离谱 一直用vps将就 那性能大家都知
  • Java Collections.list()方法具有什么功能呢?

    转自 Java Collections list 方法具有什么功能呢 下文笔者讲述Collections list 方法的功能简介说明 如下所示 Collections list 方法的功能 将参数中的值转换为一个list对象 Collec
  • 主成分分析(PCA)方法原理介绍

    原文链接 http blog codinglabs org articles pca tutorial html
  • ElasticSearch 设置(一)发现和集群形成

    文章目录 发现和集群形成 发现 种子节点提供者 基于配置的种子主机提供者 基于文件的种子主机提供者 基于法定人数的选举 主节点的选举 投票配置 偶数个符合主节点的节点 设置初始投票配置 引导一个集群 选择集群名称 发布集群状态 集群故障检测
  • 分库分表ShardingSphere<三> _ 分布式事务

    目录 一 分布式事务 1 LOCAL事务 2 XA事务 3 BASE事务 柔性事务 二 示例 1 依赖jar包 2 配置XA事务 3 使用XA事务 三 参考资料 一 分布式事务 ShardingSphere提供三种事务类型 LOCAL 默认