SpringCloud-高级篇(七)

前面在微服务里整合了Seata,下面利用Seata去解决分布式事务的问题,回去学习Seata中的四种解决方案  :首先学习XA模式

(1)XA模式

RM在前面讲的是资源管理器,在XA标准中RM都是由数据库来实现的,数据库本身实现了这个功能

XA是分布时事务领域最早的一个标准,几乎主流的数据库都实现了这个标准

XA是基于数据库本身的特性来去实现分布式事物的,是能够满足ACID的特性的,它是一种强一致性的事务

Seata实现的 是在数据库xa模式基础上做了一层封装,实现起来是比较简单的  ,它多了一个TM做整个事务的一个注册个管理,变的健壮

优势:

1.在第一阶段只是执行事务而不提交,事务一直处于运行中的一个状态的,事务本身具备ACID的特性,到了第二阶段,等到所有的分支事务都执行完了然后才一起提交,因为这个特性,每个事务都是ACID的,并且大家相互等待,因此整个事务都能实现ACID,认为这种XA具备强一致性的

2.数据库本身都实现了XA模式,数据库本身已经实现了对应的接口,你调用我我去执行,实现各种各样的功能,它是比较容器去实现分布式的效果的,Seata实现这种XA模式的时候也仅仅是在数据库接口上做了一层简单的封装形成RM,用起来非常的简单 

 缺点:

1.第一阶段不提交,等着第二阶段在提交,在等的时候占用数据库的锁,比如一个事务跨越了四五个更多的事务,每个事务执行完了还得等着别人,如果这个业务耗时较长,四五个分支都执行完耗时很久,整个事务过程中不提交占用系统资源,占用数据库锁,被人都不能访问,是一种资源的浪费,性能比较差,可用性低

2.这种方式依赖数据库底层的实现的,用起来比较简单了,但是如果数据库不支持比如Redis库,就没有办法做了

把数据源形成了一个代理,将来发起的业务sql,都会被Seata(RM)拦截下来,内部调用数据的这种接口,从而实现XA模式,数据源的配置,在参与全局事务的微服务里都需要去添加

给去全局事务的入口方法添加全局事务的注解,全局事务都由一个入口,这个入口要把它标记起来,这样我们的Seata就知道去全局事务是从哪里开始的,就会用TM代理这个方法,从这个方法开始,调用了哪些微服务我们的Seata就知道了,一个微服务的参与者就是一个分支事务了这样去全局事务的边界就定义下来了 ,这个注解只要在入口添加

(2)XA模式实现

在每个微服务里添加:XA配置 

在OrderService中的入口方法添加注解:@GlobalTransation

重启微服务

在Seata控制台里服务会重新注册:

现在的数据库:

Order表 

 account表

storage表: 

发起订单当余额充足,数量充足的时候:

数据库表正常减少:

库存-2

越-2 

订单新增:

当购买数量超过剩余的:

去看数据库会不会回滚:发现数据库还是原样没有发生变化,发生了回滚

查看日志:库存报错了

余额执行了回滚 

(3)AT模式

AT模式跟XA模式的区别是执行完业务sql,而是直接提交不是等待执行,就没有资源的等待了,直接释放了,性能就会提高 

虽然提交了,但是怎么保持数据状态的一致性呢?它会在提交前后形成一个快照,如果有问题及时回滚原样

(4)AT模式存在的问题

AT相比XA模式性能得到了提高,但是正是由于提前释放了资源,没有去做锁,这就导致了在并发访问的时候,会存在一些安全问题

会存在并发访问是,丢失更新的问题,事务一回滚后的是100,相当于事务二没有进行操作

这是因为事务没有存在隔离,事务2插入进来,事务一阶段二运行的时候出现脏数据,归根是隔离的原因,比如说阶段一和阶段二都是一个锁定状态,别人没有办法插入进来,就不会出现问题

为了解决这个问题AT模式引入全局锁

虽然说加了全局锁,但是AT模式的性能依赖比XA模式好,XA是数据库的锁,锁不释放,所有人不能访问数据,因为全局锁记录操作这张表的全局事务有Seata来管理的,如果其他事务(比如修改的是其他字段)不是有Seata来管理的 是没有影响的,AT全局锁锁定的范围是比较小的,所以性能较好

但是可能会有极端的情况 当你在修改money的过程中,有一个其他的事务没有由Seata来管理,这个时候他不需要获取全局锁也会出现这种问题,只是这种可能较低

原因:1.因为全局事务大多数执行是成功的  2.分布式事务耗时比较长,因此它的并发比较低,我们在业务上也会尽量避免多个事务去操作了同一个字段

AT对于这种极少的情况也可以这样解决:

事务一会拿更新后的快照,跟当前的数据库的值作一个对比,如果一样则证明没有其他事务更改过,可以进行回滚,不一样说明有事务做了更改Seata就知道不能修改了,这个时候需要人工介入解决

(5)AT模式实现

全局锁表lock_table 快照表undo_log

在seata相关的库中中导入

在于微服务相关的库seata_demo中新建:

更改每个微服务的模式:AT

重启服务:查看数据库表

发起异常订单: 

然后查询数据库还是原样

 新建的表也是临时存储一下数据,事务回滚完也就删除了,打断点可以看到表中的数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据挖掘目标(Kaggle Titanic 生存测试)

import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns1.数据导入 In [2]: train_data pd.read_csv(r../老师文件/train.csv) test_data pd.read_csv(r../老师文件/test.csv) labels pd.read_csv(r../老师文件/label.csv)[Su…

oracle详细安装教程(附带百度网盘资源)

一,下载安装包途径 1.官网 Unauthorized Request 2.百度网盘分析 https://pan.baidu.com/s/1n221gdTK0Fcho839oRab9g 提取码1q2w 二,安装教程 1.下载完安装包后点击 setup.exe 如果出现一下的问题,使用windows10等系统安装oracle 11g等版本的数据库…

二叉树的最大深度

问题描述: 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入&#xff1…

ue4 解决角度万向锁的问题 蓝图节点

问题:当角度值从359-1变化的时候,数值会经历358、357… 解决方法:勾上Shortest Path,角度值的会从359-1

Ajax原理以及优缺点

Ajax原理 1.Ajax的原理简单来说是在用户和服务器之间加了—个中间层(AJAX引擎),通过XmlHttpRequest对象来向服务器发异步请求, 2.从服务器获得数据,然后用javascript来操作DOM而更新页面。使用户操作与服务器响应异步化。 3.这其中最关键的一…

「Verilog学习笔记」简易秒表

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule count_module(input clk,input rst_n,output reg [5:0]second,output reg [5:0]minute);always (posedge clk or negedge rst_n) begin if (~rst…

Axure电商产品移动端交互原型,移动端高保真Axure原型图(RP源文件手机app界面UI设计模板)

本作品是一套 Axure8 高保真移动端电商APP产品原型模板,包含了用户中心、会员成长、优惠券、积分、互动社区、运营推广、内容推荐、商品展示、订单流程、订单管理、售后及服务等完整的电商体系功能架构和业务流程。 本模板由一百三十多个界面上千个交互元件及事件组…

各地加速“双碳”落地,数字能源供应商怎么选?

作者 | 曾响铃 文 | 响铃说 随着我国力争2030年前实现“碳达峰”、2060年前实现“碳中和”的“双碳”目标提出,为各地区、各行业的低碳转型和绿色可持续发展制定“倒计时”时间表,一场围绕“数字能源”、“智慧能源”、“新能源”等关键词的创新探索进…

二百一十六、Flume——Flume拓扑结构之负载均衡和故障转移的开发案例(亲测,附截图)

一、目的 对于Flume的负载均衡和故障转移拓扑结构,进行一个开发测试 二、负载均衡和故障转移 (一)结构含义 Flume支持使用将多个sink逻辑上分到一个sink组 (二)结构特征 sink组配合不同的SinkProcessor可以实现负…

《地理信息系统原理》笔记/期末复习资料(10. 空间数据挖掘与空间决策支持系统)

目录 10. 空间数据挖掘与空间决策支持系统 10.1. 空间数据挖掘 10.1.1. 空间数据挖掘的概念 10.1.2. 空间数据挖掘的方法与过程 10.1.3. 空间数据挖掘的应用 10.2. 空间决策支持系统 10.2.1. 空间决策支持系统的概念 10.2.2. 空间决策支持系统的结构 10.2.3. 空间决策…

Onlyoffice本地部署超详细教程(附协作空间2.0新资讯)

陈老老老板🤴 🧙‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🧙‍♂️本文简述:ONLYOFFICE相信大家已经有所了解,本篇讲一下o…

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包,下载的源码,需要编译安装 unzip解压 cd mjpg-streamer/mjp…

聚观早报 |一加12首销;华为智能手表释放科技温暖

【聚观365】12月12日消息 一加12首销 华为智能手表释放科技温暖 卡尔动力获地平线战略投资 英伟达希望在越南建立基地 努比亚Z60 Ultra影像规格揭晓 一加12首销 现在有最新消息,近日一加12该机已于昨日开售,售价4299元起。 外观方面,全…

【Axure高保真原型】个性化自定义图片显示列表

今天和大家分享个性化自定义图片显示列表的原型模板,鼠标点击多选按钮,可以切换按钮选中或者取消选中,按钮选中时,对应图片会在列表中显示,按钮取消后,对应图片会自动隐藏。那这个模板是用中继器制作的&…

[C++] 模板进阶(非类型模板参数,特化,分离编译)

文章目录 1、非类型模板参数2、模板的特化2.1 什么是模板特化2.2 函数模板特化2.3 类模板的实例化2.3.1 全特化2.3.2 偏特化 3、模板分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4、模板总结 1、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即…

flex布局,换行的元素上下设置间距

要生成的效果图如下: display:flexflex-direction: row;flex-wrap: wrap;当我们使用弹性盒子布局后,默认元素是没有外边距的,紧挨着样式就有点丑,如果想使换行后,元素的外边距有个距离,可以用如下方法解决…

MAC IDEA Maven Springboot

在mac中,使用idea进行maven项目构建 环境配置如何运行maven项目1.直接在IDEA中运行2.使用jar打包后执行 如何搭建spring boot1.添加依赖2.创建入口类3.创建控制器4. 运行5.其他 环境配置 官网安装IDEA使用IDEA的创建新项目选择创建MAEVEN项目测试IDEA的MAVEN路径是…

设计模式——原型模式(创建型)

引言 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。 问题 如果你有一个对象, 并希望生成与其完全相同的一个复制品, 你该如何实现呢? 首先, 你必须新建一个属于…

(第61天)多租户架构(CDB/PDB)

背景介绍 Oracle 的 CDB 和 PDB 是 Oracle 12C 及以上版本中引入的新概念,用于管理多租户数据库环境。 Oracle 数据库是商业数据库领域中的翘楚,其强大的功能和高可靠性备受企业用户追捧。而随着云计算和大数据时代的到来,Oracle 也不断推出新的技术以适应这些变化。CDB 技…

【JavaWeb学习笔记】 9 - Servlet的相关类--ServletConfig、ServletContext、HttpServletRequest

ServletConfig 一、ServletConfig 1.ServletConfig介绍 1. ServletConfig类是为Servlet程序的配置信息的类 2. Servlet程序和ServletConfig对象都是由Tomcat负责创建 3. Servlet程序默认是第1次访问的时候创建,ServletConfig在Servlet程序创建时,就…