一文搞懂分布式事务Seta-AT模式实现原理

分布式事务概念

分布式事务(Distributed Transaction) 是指在分布式系统中,涉及多个数据库、服务、消息队列等资源,并且需要保证这些资源上的操作要么全部成功提交,要么全部失败回滚的一种机制。在分布式系统中,由于网络分区、服务故障、数据不一致等问题,传统的单一数据库事务已经无法满足需求,因此需要引入分布式事务来确保数据的一致性和可靠性。

JDBC协议

要彻底理解Seta AT模式首先要搞明白JDBC协议。

JDBC(Java Database Connectivity)是一个标准的Java API,用于在Java程序中连接和执行数据库操作。它提供了一种统一的方式来连接和操作不同类型的数据库,如MySQL、PostgreSQL、Oracle等。

JDBC协议中定义了核心的顶层接口,面向核心顶层接口编程,所以切换数据库,只要添加对应数据库的驱动,修改数据库连接地址等信息即可,应用层不用修改代码。

  1. 核心接口

    • Connection

    • ResultSet

    • Statement

  2. JDBC编程示例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class JdbcExample {public static void main(String[] args) {// 数据库连接URL,格式为:jdbc:子协议:子名称String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "root";try(//1. 创建数据库连接Connection connection = DriverManager.getConnection(jdbcUrl, username, password);     //2. 创建Statement对象Statement statement = connection.createStatement();//3. 执行SQL查询ResultSet resultSet = statement.executeQuery("SELECT * FROM table");){//4 处理查询结果while (resultSet.next()) {System.out.println(resultSet.getString(1));}} catch (Exception e) {e.printStackTrace();}}
}

Seta AT

AT模式全称为auto transaction,是一种无侵入的分布式事务解决方案,Seta整体设计基于两阶段提交模型,一阶段执行完成后本地事务提交,二阶段释放全局锁以及删除事务undo 日志或者回滚。

一阶段:

第一阶段分成两个步骤

  1. 基于JDBC协议实现拦截业务sql,解析sql,根据sql语句中的条件,生成查询查询前像sql语句,在数据库查询,将查询结果当做快照,保存在before image(行记录更新前数据)中,后期如果事务回滚,需要根据before image保存的数据生成反向sql进行回滚。

Seta实现了JDBC协议,业务与数据库交互首先要经过Seta实现的JDBC接口,对sql进行了拦截以及改写,处理完成后将sql发送到真实数据库执行。

  1. 执行sql更新业务数据,将业务数据更新之后的结果保存成after image(行记录更新后的数据),此处更新后的结果有可能查询数据库,也有可能不查询数据库,有些内存可以计算的就不去查询数据库,同时要根据主键生成行锁,行锁的目的是在二阶段提交前避免脏读问题,防止其他事务对数据进行修改。

这两个步骤都在同一个本地事务中,就可以利用数据库的事务特性保证数据的一致性。

二阶段:

对于AT模式,二阶段提交主要是将每个事务的参与者将before和after快照数据删除,同时释放行锁即可。

如果回滚,首先将after image中的数据和数据库进行对比,如果一致,利用before image回滚即可,如果不一致,需要人工干预处理,一般不会出现这个问题。

后续文章继续讲解具体sql拦截处理过程。

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

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

相关文章

IO流---字节流.Java

一,概述 IO流是存储和读取数据的解决方案。 I:input O:output流:像水流一样传输数据 因为IO流与File是息息相关的,所以在学习IO流之前,简单回顾一下File:😄😊&#…

python对文本操作,生成可执行文件

.exe文件主要包含pingmianF.py文件和read_inp_auto.py文件 实现效果 代码 read_inp_auto.py #-*- coding: utf-8 -*- import re import sys import os import os.path import time import pingmianF from pingmianF import vector import numpy as np from tkinter import me…

GDPU JavaWeb EL与JSTL

标签化,可以简化百分号的繁忙。 标签库配置 先下载好jstl标签库,然后放到lib。接着,要让编译器识别到,因此要在模块配置依赖,这里导jar包都得注意一下模块依赖。 也可以在libraries项目库设置。 EL与JSTL查询图书 在…

2024华为OD机试真题-攀登者1-C++(C卷D卷)

题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。 其中数组元素0代表地面。 例如: [0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的地图, 地图中有两个山脉位置分别为1,2,3,4,5 …

设计模式(十)结构型模式---享元模式

文章目录 享元模式简介结构UML图具体实现UML图代码实现 享元模式简介 享元模式(fly weight pattern)主要是通过共享对象来减少系统中对象的数量,其本质就是缓存共享对象,降低内存消耗。享元模式将需要重复使用的对象分为两个状态…

大学生Python自救课程总结

因为一些事情的缘故,我已经几乎没有更新很久了,然后现在快到期末了,不知道各位学习python的同志们慌不慌【坏笑】。 本学期,我只是简单的讲了讲python的基础用法。当然,可能有些地方总结的并不全面,很多知…

面试高频问题----2

一、进程、线程、协程有什么区别? 1.进程:进程是操作系统中独立运行的程序实例,每个进程都有自己的内存空间和系统资源;进程之间相互独立,每个进程有自己的内存地址空间,一个进程无法直接访问另一个进程的…

MyBatis中的接口代理机制及其使用

1. MyBatis中的接口代理机制及其使用 文章目录 1. MyBatis中的接口代理机制及其使用2. 实操2.1 准备工作2.2 insert 增加操作2.3 delete 删除操作2.4 update 修改操作2.5 select 查询一条记录操作2.6 select 查询多条记录操作 3. 总结:4. 最后: MyBatis …

基于状态空间模型的预测控制

1、状态空间模型 线性离散时间系统的状态空间模型如下: x ( k 1 ) A x ( k ) B u u ( k ) B d d ( k ) y c ( k ) C c x ( k ) (1) \begin{aligned} &x(k1)Ax(k)B_uu(k)B_dd(k)\\[1ex] &y_c(k)C_cx(k)\tag{1} \end{aligned} ​x(k1)Ax(k)Bu​u(k)Bd​…

HackTheBox-Machines--Nineveh

Nineveh测试过程 1 信息收集 NMAP 端口扫描 80 端口 80端口是服务器的默认页面,无可利用功能点,源代码没有可利用的敏感信息 目录扫描 1.http://10.129.25.123/department 访问/department目录跳转到登录页面,尝试暴力破解,获取…

Java——标识符

一、标识符介绍 1、什么是标识符 标识符(Identifier)是Java编程语言中用于命名变量、方法、类、包、常量及其他用户定义项目的名称。简单的说就是只要是可以自定义命名的地方就是标识符。 2、标识符的命名规则 在Java中,标识符的命名必须…

嵌入式期末复习

一、选择题(20) 二、判断题(10) 三、填空题(10) 主机-目标机的文件传输方式主要有串口传输方式、网络传输方式、USB接口传输方式、JTAG接口传输方式、移动存储设备方式。常用的远程调试技术主要有 插桩/st…

NVIDIA NeMo - 训练本地化多语种 LLM

本文转载自:使用 NVIDIA NeMo 训练本地化多语种 LLM (2024年 5月 17日 By Nicole Luo and Amit Bleiweiss 第 1 部分 https://developer.nvidia.com/zh-cn/blog/training-localized-multilingual-llms-with-nvidia-nemo-part-1/ 第 2 部分 https://deve…

SourceTree配置

SourceTree跳过注册方法跳过注册页 2.SourceTree分体暂存视图 配置(暂存才会生效) 3.SourceTree提交信息描述模版配置 备注: SourceTree核心GUI操作直观 Atlassian 提交信息描述模版配置: #应集团要求:所有需要发布的应用都需要按照以下的…

cocos入门1:简介

Cocos是一款由厦门雅基软件有限公司推出的数字内容开发一站式解决方案,它具备开源、免费、轻量、高性能等特点,为全球范围内的开发者提供服务。以下是对Cocos的详细介绍及教程概括: Cocos的基本介绍 产品背景:Cocos成立于2010年…

Cocos入门2:软件安装

Cocos Creator的安装教程如下,按照步骤进行,可以帮助您顺利安装Cocos Creator: 一、下载Cocos Dashboard 访问Cocos官网:前往Cocos Creator的官方网站(https://www.cocos.com/creator/)。 下载Cocos Dash…

【架构艺术】代码架构治理之四层境界

最近逐渐开始写一些简单且稍微务虚的文章。原因有挺多,其一是,自己的工作内容和企业的内部情况绑定的更加深入了,许多信息如果要在互联网上分享,需要考虑在很多地方做加工;其二是,过分拘泥于非常深度的技术…

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介)

重生之 SpringBoot3 入门保姆级学习(14、内容协商基础简介) 3.3 内容协商3.3.1 基础简介3.3.2 演示效果 3.3 内容协商 3.3.1 基础简介 默认规则 基于请求头的内容协商(默认开启) 客户端向服务器发送请求,携带 HTTP 标…

GraphQL(1):GraphQL简介

1 GraphQL介绍 GraphQL是Facebook开发的一种数据查询语言,并于2015年公开发布。它是RESTAPI的替代品。 GraphQL 既是一种用于 API的查询语言也是一个满足你数据查询的运行时。 GraphQL对你的 API中的数据提供了一套易于理解的完整描述,使得客户端能够准…

20240601使用iperf3在Toybrick的TB-RK3588开发板上跑预编译的Android12测网速

20240601使用iperf3在Toybrick的TB-RK3588开发板上跑预编译的Android12测网速 2024/6/1 20:39 【常见问题】给TB-RK3588开发板刷机Androidd12之后,如果刷机线type-C不拔掉。可能起不来! 搞得我都以为板子坏了呢! rootrootrootroot-ThinkBook-…