0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Sharding JDBC 实战:分布式事务处理

jf_ro2CN3Fa ? 来源:CSDN ? 2022-12-22 15:06 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

  • 1. 什么是全局事务呢?
  • 2. 2pc提交协议
  • 3. XA事务存在的问题
  • 4. CAP理论
  • 5. Sharding-JDBC分布式事务支持
  • 6. 项目地址

在我们使用Sharding JDBC分库分表的时候,会带来另外一个问题,就是分布式事务问题,如下图所示。用户采购商品业务,整个业务包含3个微服务:

  • 库存服务: 扣减给定商品的库存数量。
  • 订单服务: 根据采购请求生成订单。
  • 账户服务: 用户账户金额扣减。

这三个业务操作应该属于同一个事务,但是这些数据却分配在不同的数据库上,所以没办法采用数据库的事务来保证数据一致性。

d9316416-81b9-11ed-8abf-dac502259ad0.png

这个时候,要解决分布式事务问题,就需要引入全局事务。

1. 什么是全局事务呢?

全局事务是一个DTP模型的事务,所谓DTP模型指的是 X/Open DTP (X/Open Distributed Transaction Processing Reference Model),是 X/Open 这个组织定义的一套分布式事务的标准。

X/Open,即现在的open group,是一个独立的组织,主要负责制定各种行业技术标准。

官网地址:http://www.opengroup.org/

X/Open组织主要由各大知名公司或者厂商进行支持,这些组织不光遵循X/Open组织定义的行业技术标准,也参与到标准的制定。

X/Open了定义了规范和API接口,由这个厂商进行具体的实现,这个标准提出了使用二阶段提交(2PC –Two-Phase-Commit)来保证分布式事务的完整性。后来J2EE也遵循了X/OpenDTP规范,设计并实现了java里的分布式事务编程接口规范-JTA,如下图所示,表示一个X/Open DTP模型。

d9499f7c-81b9-11ed-8abf-dac502259ad0.png

X/Open DTP模型定义了三个角色和两个协议,其中三个角色分别如下:

  • AP(Application Program ,表示应用程序,也可以理解成使用DTP模型的程序
  • RM(Resource Manager) ,资源管理器,这个资源可以是数据库, 应用程序通过资源管理器对资源进行控制,资源管理器必须实现XA定义的接口
  • TM(Transaction Manager) ,表示事务管理器,负责协调和管理全局事务,事务管理器控制整个全局事务,管理事务的生命周期,并且协调资源。

两个协议分别是:

XA协议: XA 是X/Open DTP定义的资源管理器和事务管理器之间的接口规范,TM用它来通知和协调相关RM事务的开始、结束、提交或回滚。

目前Oracle、Mysql、DB2都提供了对XA的支持;XA接口是双向的系统接口,在事务管理器(TM ) 以及多个资源管理器之间形成通信的桥梁(XA不能自动 提交)

  • https://dev.mysql.com/doc/refman/8.0/en/xa.html
  • https://dev.mysql.com/doc/refman/8.0/en/xa-statements.html

XA协议的语法,主流的数据库都支持 XA协议,从而能够实现跨数据库事务。

XA{START|BEGIN}xid[JOIN|RESUME]--负责开启或者恢复一个事务分支,并且管理XID到调用线程
XAENDxid[SUSPEND[FORMIGRATE]]--负责取消当前线程与事务分支的关联
XAPREPARExid--负责询问RM是否准备好了提交事务分支
XACOMMITxid[ONEPHASE]--知RM提交事务分支
XAROLLBACKxid--通知RM回滚事务分支
XARECOVER[CONVERTXID]

TX协议: 全局事务管理器与资源管理器之间通信的接口

在分布式系统中,每一个机器节点虽然都能够明确知道自己在进行事务操作过程中的结果是成功还是失败,但却无法直接获取到其他分布式节点的操作结果。

因此当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个“协调者”(TM)来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点被称为AP。TM负责调度AP的行为,并最终决定这些AP是否要把事务真正进行提交到(RM)。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

2. 2pc提交协议

在X/OpenDTP模型中,一个分布式事务所涉及的SQL逻辑都执行完成,并到了(RM)要最后提交事务的关键时刻,为了避免分布式系统所固有的不可靠性导致提交事务意外失败,TM 果断决定实施两步走的方案,这个就称为二阶提交,如下图所示。

二阶段提交,是计算机网络尤其是在数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务处理过程中能够保持原子性和一致性而设计的一种算法。通常,二阶段提交协议也被认为是一种一致性协议,用来保证分布式系统数据的一致性。

目前,绝大部分的关系型数据库都是采用二阶段提交协议来完成分布式事务处理的,利用该协议能够非常方便地完成所有分布式事务AP的协调,统一决定事务的提交或回滚,从而能够有效保证分布式数据一致性,因此2pc也被广泛运用在许多分布式系统中。

d973a128-81b9-11ed-8abf-dac502259ad0.png

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

3. XA事务存在的问题

上述基于XA协议的全局事务,是属于强一致性事务,因为在全局事务中,只要有任何一个RM出现异常,都会导致全局事务回滚。同时,本地事务在Prepare阶段锁定资源时,如果有其他事务要要修改相同的数据,就必须要等待前面的事务完成,这本身是无可厚非的设计,但是由于多个RM节点是跨网络,一旦出现网络延迟,就导致该事务一直占用资源使得整体性能下降。

另外,在XA COMMIT阶段,如果其中一个RM因为网络超时没有收到数据提交的指令,会导致数据不一致,为了解决这个问题,很多开源分布式事务框架都会提供重试机制来保证数据一致性。

4. CAP理论

说到强一致性的问题,必然要提到CAP理论。

CAP的含义:

  • C:Consistency 一致性 同一数据的多个副本是否实时相同。
  • A:Availability 可用性 可用性:一定时间内 & 系统返回一个明确的结果 则称为该系统可用。
  • P:Partition tolerance 分区容错性 将同一服务分布在多个系统中,从而保证某一个系统宕机,仍然有其他系统提供相同的服务。

CAP理论告诉我们,在分布式系统中,C、A、P三个条件中我们最多只能选择两个。那么问题来了,究竟选择哪两个条件较为合适呢?

对于一个业务系统来说,分区容错性是必须要满足的条件。业务系统之所以使用分布式系统,主要原因有两个:

  • 提升整体性能 当业务量猛增,单个服务器已经无法满足我们的业务需求的时候,就需要使用分布式系统,使用多个节点提供相同的功能,从而整体上提升系统的性能,这就是使用分布式系统的第一个原因。
  • 实现分区容错性 单一节点 或 多个节点处于相同的网络环境下,那么会存在一定的风险,万一该机房断电、该地区发生自然灾害,那么业务系统就全面瘫痪了。为了防止这一问题,采用分布式系统,将多个子系统分布在不同的地域、不同的机房中,从而保证系统高可用性。

所以我们需要根据自己的业务需求,选择采取CP还是AP。

5. Sharding-JDBC分布式事务支持

了解了X/Open DTP模型的全局事务解决方案,就必然需要一个成熟的技术中间件来简化我们对于分布式事务的开发逻辑,而Sharding-JDBC提供了分布式事务解决方案。

Sharding-JDBC支持以下四种事务模型,实际上这些分布式事务模式都是集成开源的事务组件做的集成。

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

Apache ShardingSphere 默认的 XA 事务管理器为 Atomikos,下面我们通过Atomikos来配置一个分布式事务的使用模型。

5.1 Atomikos事务

Atomikos是为Java平台提供的开源的事务管理工具,它包含收费和开源两个版本,开源版本基本能满足我们的需求。

Atomikos实现了JTA/XA规范中的事务管理器(Transaction Manager)应该实现的相关接口。

JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据,JDBC驱动程序的JTA支持极大地增强了数据访问能力。

  • TransactionManager : 常用方法,可以开启、回滚、获取事务。begin(),rollback()…
  • XAResouce : 资源管理,通过Session来进行事务管理。commit(xid)…
  • XID : 每一个事务都分配一个特定的XID

JTA是如何实现多数据源的事务管理呢?

主要的原理是两阶段提交,以上面的请求业务为例,当整个业务完成了之后只是第一阶段提交,在第二阶段提交之前会检查其他所有事务是否已经提交,如果前面出现了错误或是没有提交,那么第二阶段就不会提交,而是直接rollback操作,这样所有的事务都会做Rollback操作。

5.2 实战

5.2.1 项目搭建

使用IDEA直接创建Spring boot 项目即可。

5.2.2 依赖

由于使用XA事务,所以除了Sharding依赖外还需要引入事务依赖。

<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starterartifactId>
<version>5.0.0-alphaversion>
dependency>
<dependency>
<groupId>com.zaxxergroupId>
<artifactId>HikariCPartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>org.freemarkergroupId>
<artifactId>freemarkerartifactId>
dependency>

<dependency>
<groupId>org.apache.shardingspheregroupId>
<artifactId>shardingsphere-transaction-xa-coreartifactId>
<version>5.0.0-alphaversion>
dependency>

5.2.3 配置

接下来就是配置相关数据库连接信息以及分片规则;

在这里主要做的是创建了两个数据源(数据源最好设置两台服务器的数据库)以及设置好了相应的分库规则。

server.port=8080
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html

spring.shardingsphere.props.sql-show=true
spring.shardingsphere.datasource.names="ds-0,ds-1"
spring.shardingsphere.datasource.common.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.common.driver-class-name=com.mysql.jdbc.Driver

spring.shardingsphere.datasource.ds-0.jdbc-url=jdbc//localhost:3306/shard01?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.ds-0.username=root
spring.shardingsphere.datasource.ds-0.password=123456

spring.shardingsphere.datasource.ds-1.jdbc-url=jdbc//localhost:3306/shard02?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.shardingsphere.datasource.ds-1.username=root
spring.shardingsphere.datasource.ds-1.password=123456

spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.default-database-strategy.standard.sharding-algorithm-name=database-inline
spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.type=INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.database-inline.props.algorithm-expression=ds-$->{user_id % 2}

spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.column=order_id
spring.shardingsphere.rules.sharding.tables.t_order.key-generate-strategy.key-generator-name=snowflake

spring.shardingsphere.rules.sharding.key-generators.snowflake.type=SNOWFLAKE
spring.shardingsphere.rules.sharding.key-generators.snowflake.props.worker-id=123

5.2.4 事务一致性注解

Sharding jdbc解决事务一致性可以直接通过@ShardingTransactionType(TransactionType.XA)注解实现,我们只需要在对应的方法上加上即可。

比如下图,由于我们在配置文件中是通过user_id进行分库的,然后我们在这里通过随机数,会根据分片规则往两个数据库中插入数据。

当i=4的时候,我们人为的制造异常,如果我们不采用全局事务的话,则之前插入的数据还会再数据库中。所以这个时候我们只需要加上@ShardingTransactionType(TransactionType.XA)注解即可,XA属于强一致性。

d999c59c-81b9-11ed-8abf-dac502259ad0.png

6. 项目地址

https://gitee.com/cl1429745331/sharding-jdbc-demo



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3951

    浏览量

    66849
  • 分布式
    +关注

    关注

    1

    文章

    1016

    浏览量

    75651
  • JDBC
    +关注

    关注

    0

    文章

    25

    浏览量

    13654

原文标题:Sharding JDBC 实战:分布式事务处理

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    曙光存储领跑中国分布式存储市场

    近日,赛迪顾问发布《中国分布式存储市场研究报告(2025)》,指出2024 年中国分布式存储市场首次超过集中式存储,规模达 198.2 亿元,增速 43.7%。
    的头像 发表于 05-19 16:50 ?614次阅读

    MCU分布式模块化自动测量单元:数据传输与处理能力如何?

    在现代工程监测中,MCU分布式模块化自动测量单元(MCU)以其灵活的配置和强大的数据处理能力,成为了各类安全监测项目的理想选择。本文将深入探讨MCU的工作原理、数据传输方式以及其在实际应用中的优势
    的头像 发表于 03-12 14:09 ?471次阅读
    MCU<b class='flag-5'>分布式</b>模块化自动测量单元:数据传输与<b class='flag-5'>处理</b>能力如何?

    分布式日志追踪ID实战

    作者:京东物流 张小龙 本文通过介绍分布式应用下各个场景的全局日志ID透传思路,以及介绍分布式日志追踪ID简单实现原理和实战效果,从而达到通过提高日志查询排查问题的效率。 背景 开发排查系统问题用得
    的头像 发表于 01-20 10:16 ?709次阅读

    分布式云化数据库有哪些类型

    分布式云化数据库有哪些类型?分布式云化数据库主要类型包括:关系型分布式数据库、非关系型分布式数据库、新SQL分布式数据库、以列方式存储数据、
    的头像 发表于 01-15 09:43 ?565次阅读

    基于ptp的分布式系统设计

    在现代分布式系统中,精确的时间同步对于确保数据一致性、系统稳定性和性能至关重要。PTP(Precision Time Protocol)是一种网络协议,用于在分布式系统中实现高精度的时间同步
    的头像 发表于 12-29 10:09 ?697次阅读

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移

    === AbilityConstant.LaunchReason.CONTINUATION) { // ... // 调用封装好的分布式数据对象处理函数 this.handleDistributedData(want
    发表于 12-24 10:11

    HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据权限与基础数据

    === AbilityConstant.LaunchReason.CONTINUATION) { // ... // 调用封装好的分布式数据对象处理函数 this.handleDistributedData(want
    发表于 12-24 09:40

    分布式通信的原理和实现高效分布式通信背后的技术NVLink的演进

    大型模型的大小已经超出了单个 GPU 的范围。所以就需要实现跨多个 GPU 的模型训练,这种训练方式就涉及到了分布式通信和 NVLink。 当谈及分布式通信和 NVLink 时,我们进入了一个引人入胜且不断演进的技术领域,下面我们将简单介绍
    的头像 发表于 11-18 09:39 ?1459次阅读
    <b class='flag-5'>分布式</b>通信的原理和实现高效<b class='flag-5'>分布式</b>通信背后的技术NVLink的演进

    分布式光纤测温解决方案

    分布式光纤测温解决方案
    的头像 发表于 11-12 01:02 ?638次阅读
    <b class='flag-5'>分布式</b>光纤测温解决方案

    浅谈屋顶分布式光伏发电技术的设计与应用

    【摘要】为了缓解城市用电紧张袁降低人们的用电成本,可以在工业园区、办公楼屋顶等场所应用屋顶分布式光伏发电技术进行就近转换、并网发电袁充分利用建筑物屋顶的太阳资源。概述屋顶分布式光伏发电技术,分析屋顶
    的头像 发表于 11-11 15:10 ?2024次阅读
    浅谈屋顶<b class='flag-5'>分布式</b>光伏发电技术的设计与应用

    Spring事务实现原理

    作者:京东零售 范锡军 1、引言 spring的spring-tx模块提供了对事务管理支持,使用spring事务可以让我们从复杂的事务处理中得到解脱,无需要去处理获得连接、关闭连接、
    的头像 发表于 11-08 10:10 ?1230次阅读
    Spring<b class='flag-5'>事务</b>实现原理

    分布式光纤测温是什么?应用领域是?

    时,该处的散射光特性会受到影响。通过高速信号采集与数据处理技术,可以准确地定位发生温度变化的位置,并给出实时的温度信息。简而言之,分布式光纤测温技术将整条传输光纤作为传感器,光纤上的每一点都兼具“传”和“感”
    的头像 发表于 10-24 15:30 ?1441次阅读
    <b class='flag-5'>分布式</b>光纤测温是什么?应用领域是?

    分布式光纤声波传感技术的工作原理

    分布式光纤声波传感技术(Distributed Acoustic Sensing,DAS)是一种利用光纤作为传感元件,实现对沿光纤路径上的环境参数进行连续分布式测量的技术。
    的头像 发表于 10-18 14:50 ?3224次阅读
    <b class='flag-5'>分布式</b>光纤声波传感技术的工作原理

    分布式输电线路故障定位中的分布式是指什么

    所谓分布式指的是产品的部署方式,是相对于集中式而言的。 一、部署方式 分散安装:分布式输电线路故障定位系统中的采集装置需要安装在输电线路的多个位置,通常是每隔一定距离设置一个监测点,以确保对整条线路
    的头像 发表于 10-16 11:39 ?760次阅读
    <b class='flag-5'>分布式</b>输电线路故障定位中的<b class='flag-5'>分布式</b>是指什么

    分布式功能安全的创新与突破

    近日,Imagination推出全新性能最高且具有高等级功能安全性的汽车GPUIP——ImaginationDXSGPU,并且是Imagination第一款带有“分布式安全机制”的处理器。下载白皮书
    的头像 发表于 09-20 08:09 ?554次阅读
    <b class='flag-5'>分布式</b>功能安全的创新与突破