Mycat事务补偿设计

news2024/9/25 3:26:33

     1.概述

在使用数据分片场景下,单库下的事务处理无法满足系统的需求,因而需要进行分布式事务处理设计。

     2.主要方案对比分析

处理分布式场景下的事务有很多种方案,主要方案如下表所示:

主要技术

优点

缺点

适用场景

XA with 2PC
(JTA)、 3PC、

事务管理最为严格,基本可以确保事务

对开发人员透明

性能差

实现复杂度高

可扩展性差

对事务要求苛刻,直接面向DB

TCC

事务管理较为严格,基本可以确保事务

对开发人员透明

性能差

可扩展性差实现复杂度高

未开放成熟方案与源码

对事务要求苛刻,直接面向DB

Best Efforts 1PC等

事务管理较为严格,基本可以确保事务

对开发人员透明

性能差

可扩展性差

实现复杂度高

未开放成熟方案与源码

对事务要求苛刻,直接面向DB

Transaction Conpensation

采用最终一致性,性能高

可扩展性好

切换Proxy时,无须修改程序源码

对开发人员不透明,需要较多的编码

发生异常时可能需要人工干预

数据一致性的实时性较弱

数据分片

有Proxy

长事务

根据以上对比结果,对于与Mycat结合的事务处理,采用事务补偿方式对事务进行管理。

     3.设计

        3.1设计难点

使用事务补偿方式对事务进行管理的技术难点主要体现在以下两个方面:

          3.1.1. 失败处理

当事务提交失败时,需要进行回滚操作,如果回滚失败,需要对回滚失败进行处理,而每一步处理都可能继续失败,此问题类似于“拜占庭将军问题”。

          3.1.2. 事务的隔离

事务执行过程中,需要对事务相关的数据进行隔离,如何有效的隔离,需要根据实际场景,对业务进行加锁。

          3.1.3. 混合事务

在Mycat中,主子表间可以配置刚性事务,如果刚性事务与柔性事务混合在一起,处理比较困难。

3.2设计说明

事务补偿方式采用BASE事务模型,使用事务补偿方式对事务进行管理,牺牲了高一致性,获得高性能,提升了可用性,事务补偿方式管理的事务可以视为一种柔性事务。

采用BASE事务与ACID事务的比较:

ACID

BASE

原子性

则成功则全部成功;若失败,则全部回滚

可能全部成功,也可能部分成功。如果失败,则回滚,若回滚失败,进行异常处理(进行监控并人工处理)

一致性

在事务开始或结束时,数据库应该在一致状态

在事务开始或结束时,数据库可能在一致状态,也可能不在一致状态,但最终将达到一致状态

隔离性

在数据库事务进行隔离

采用业务锁进行隔离或不隔离

持久化

若事务完成,则不能返回

若事务完成,则不能返回

BASE事务处理设计包含三部分:事务管理接口,事务监控任务&异常事务展现,以及校对任务,如下图所示:

对于混合事务,将事务切分为两个事务,对刚性事务不进行回滚,特殊处理之。

事务处理接口伪代码(部分伪码,仅供参考):

Try{
    记业务Log
    While(有待处理SQL){
       判断是否有业务锁,若有业务锁则加业务锁
       执行SQL
       反写执行成功标记位
    }
    获取待处理锁(锁的顺序与业务SQL顺序相反)
    While(有待处理锁){
        解锁
    }
}catch(异常){
    记录Log
    回滚并解锁
    抛出异常或返回错误信息
}finally{
    记录快照
    后续处理
}

 

function 记业务Log(String SQL){
    写log
    若写失败,抛TLogException
}

function 加锁(String SQL){
    加锁
    若写失败,则抛出TLockException
}

function 回滚并解锁(List<RollableSQL> sqls){
	回滚
    若失败,则抛出TLockException
}

3.3风险与规避措施

3.3.1风险

隔离性风险:

对于部分无法隔离的数据,可能造成业务数据的错误,如减库存失败且无法隔离的情况下,可能造成超卖

  • SQL执行失败以后,系统有新数据进入系统,当重新执行时,可能影响后进入系统的数据。

一致性风险:

部分不一致场景客户可能无法忍受。

非幂等SQL风险:

对于非幂等sql, 多次执行将造成数据错误。

3.3.2规避措施

通过数据校对任务检测错误数据。

3.4约束

单据的删除需要使用逻辑删除

查询业务数据时需要区分被锁定的数据与未被锁定的数据

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

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

相关文章

左耳朵耗子:TCP 的那些事儿(下)

原文地址&#xff1a;https://coolshell.cn/articles/11609.html 这篇文章是下篇&#xff0c;所以如果你对TCP不熟悉的话&#xff0c;还请你先看看上篇《TCP的那些事儿&#xff08;上&#xff09;》 上篇中&#xff0c;我们介绍了TCP的协议头、状态机、数据重传中的东西。但是T…

Spark 7:Spark SQL 函数定义

SparkSQL 定义UDF函数 方式1语法&#xff1a; udf对象 sparksession.udf.register(参数1&#xff0c;参数2&#xff0c;参数3&#xff09; 参数1&#xff1a;UDF名称&#xff0c;可用于SQL风格 参数2&#xff1a;被注册成UDF的方法名 参数3&#xff1a;声明UDF的返回值类型 ud…

部分调试记录

Ubuntu16.04纯命令行安装VMwareTools hudahuahudahua-virtual-machine:~$ sudo apt-get install open-vm-tools -yhudahuahudahua-virtual-machine:~$ sudo apt-get install open-vm-tools-desktop无法加载so文件&#xff0c;版本问题 [rootdragonboard /]# ./Qserial -qws .…

工厂生产作业流程合规检测

工厂生产作业流程合规检测系统通过yolov7网络模型算法&#xff0c;工厂生产作业流程合规检测对作业人员的操作行为进行全面监测&#xff0c;通过图像识别算法和数据分析&#xff0c;对人员的操作动作、工具使用、安全防护等方面进行检测和评估&#xff0c;能够实时监测工人的操…

10行Python代码能做出哪些酷炫的事情?

Python凭借其简洁的代码&#xff0c;赢得了许多开发者的喜爱。因此也就促使了更多开发者用Python开发新的模块&#xff0c;从而形成良性循环&#xff0c;Python可以凭借更加简短的代码实现许多有趣的操作。下面我们来看看&#xff0c;我们用不超过10行代码能实现些什么有趣的功…

【Linux】【驱动】驱动挂载的时候给驱动传递参数

【Linux】【驱动】驱动挂载的时候给驱动传递参数 绪论1.什么是驱动传参驱动传参就是传递参数给我们的驱动举例:2.驱动传参数有什么作用呢?3. 传递单个参数使用如下的数组4. 传递数组使用以下函数&#xff1a; 传递数字值代码指令 传递数组代码传递数组指令 绪论 1.什么是驱动…

拒绝摆烂!C语言练习打卡第六天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

hbuilderx小程序基于Android的个人健身运动记录生活APP_45n2x

近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;记录生活信息利用计算机网络实现信息化管理&#xff0c;使整个记录生活管理的发展和服务水平有显著提升。 本文拟采用Android平台进行…

玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

前言 基于我个人的工作内容和兴趣&#xff0c;想要在家里搞一套服务器集群&#xff0c;用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器&#xff0c;比如 Dell R730, 还搞了一套配置清单&#xff0c;如下&#xff1a; Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…

【Linux网络】TCP UDP socket HTTP webSocket之间的区别

目录 一、OSI & TCP/IP模型 二、几者之间的关系 三、HTTP 四、Socket 五、WebSocket 5.1、WebSocket 优点 一、OSI & TCP/IP模型 首先我们要了解OSI七层模型&#xff0c;和预支对应的TCP/IP 四层的模型。 用下面的图可以看出&#xff0c;TCP UDP 工作在传输层&…

JavaScript:基本语法(变量与函数的定义与使用)

文章目录 script 标签srcdefer 延迟加载 基本语法定义变量 与 使用变量基本类型typeof 查看变量类型复合类型数组类型定义对象类型定义 函数定义函数使用函数 script 标签 src 和scc一样可以内嵌也可以外src外引。 一般是推荐外引。 <script src"idx.js">&l…

机器视觉应用开发四大软件,那一个对我们从0到1建设你的机器视觉知识体系更好

我们首先要理解什么是知识体系&#xff1a; 我们身处一个知识爆炸时代&#xff0c;我们面对各种课程&#xff0c;各种知识&#xff0c;“自身学习”&#xff0c;“高效记忆”&#xff0c;“批判性思维”&#xff0c;“解决问题的能力”。各种平台课程太多&#xff0c;各种买买…

《华为认证》配置vlan聚合

1、实验环境&#xff1a;如图所示&#xff0c;配置vlan 10、20、100 &#xff0c;vlan 100作为聚合vlan&#xff0c;vlan 10、vlan20作为子vlan&#xff0c;vlan 10和vlan 20配置成相同网段的ip地址。Vlanif 100 作为vlan 10 和vlan20的网关&#xff0c;在vlanif100上配置arp代…

linux查看正在运行的nginx在哪个文件夹当中

1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录&#xff08;当前工作目录&#xff09;

基于Nodejs+vue的学习笔记分享系统设计与开发

本系统结合现今主流管理系统的功能模块以及设计方式进行分析&#xff0c;使用nodejs语言和vue.js框架进行开发设计&#xff0c;具体研究内容如下&#xff1a; (1) 管理员主要对个人中心&#xff0c;用户管理&#xff0c;笔记本管理&#xff0c;笔记分享管理&#xff0c;分享…

流量洪峰?不惧!手把手教你应对高并发挑战!

大家好&#xff0c;我是你们的小米&#xff01;今天我要和大家聊一个充满挑战和创意的话题&#xff1a;如何解决瞬时大流量高并发&#xff1f;想必很多小伙伴们在开发过程中都遇到过这个让人头疼的问题吧。别担心&#xff0c;我在这里和你分享我的经验&#xff0c;让你轻松驾驭…

网站巡检的重要性及其后果分析

在信息化、电子化的今天&#xff0c;网站已经成为企业、组织和个人展示形象、传播信息、提供服务的重要窗口。与此同时&#xff0c;为了确保网站的正常运行、用户体验和数据安全&#xff0c;定期的网站巡检就显得尤为重要。以下对网站巡检的重要性和可能的后果进行深入分析&…

部署 ssm 项目到云服务器上(购买云服务器 + 操作远程云服务器 + 服务器中的环境搭建 + 部署项目到服务器)

部署 Web 项目 1、获取 Linux 环境1.1、如何去买一个云服务器1.2、远程操作云服务器1.3、在 Linux 系统中搭建 Java Web 的运行环境。1&#xff09;安装 JDK&#xff08;使用包管理器 yum 来安装&#xff09;2&#xff09; 安装Tomcat3&#xff09;安装 MySQL。 1.4、在云服务器…

南卡开放式耳机再添新品,南卡OE CC会不会成为行业搅局者?

Nank南卡官方于8月25日宣布&#xff0c;将要上线一款百元级性价比神机-南卡OE CC&#xff0c;该新款开放式耳机以“年度开放式耳机百元标杆”为宣传口号&#xff0c;Nank南卡一直以来坚持产品力优先&#xff0c;在研发上一直都很激进&#xff0c;上一代的OE Pro首创了EAA悬停舒…

【无需公网IP】在树莓派上搭建Web站点

目录 1.概述 2.使用 Raspberry Pi Imager 安装 Raspberry Pi OS 3.设置 Apache Web 服务器 3.1测试 web 站点 3.2安装静态样例站点 3.3将web站点发布到公网 3.4安装 Cpolar 3.5cpolar进行token认证 3.6生成cpolar随机域名网址 3.7生成cpolar二级子域名 3.8将参数保存…