Springboot整合 Spring Cloud Alibaba Seata

1.事务简介

事务是访问并可能更新数据库中各种数据项的一个程序执行单元。在关系型数据库中,一个事务由一组sql语句组成。事务具有 原子性,一致性,隔离性,持久性四个属性(ACID)。
原子性:事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。一组Sql中,执行要么都成功,要么都失败。
一致性:事务必须是使数据库从一个一致性状态变更到另一个一致性状态,事务的中间状态不能被观察到。一组Sql执行后,不管是提交还是回滚,数据都是一致的。
隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。并发执行的各个事务之间不能相互干扰。隔离性又分为四个级别:读未提交(read uncommitted),读已提交(read commited,解决脏读),可重复读(repeatable read,解决虚读),串行化(serializable,解决幻读)。
持久行:事务一旦提交,它对数据库中数据的改变就应该是永久性的。事务分为本地事务(单体项目中使用的@Transational)和分布式事务。

2.Seata介绍

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。AT模式是阿里首推的模式。
官网地址:https://seata.apache.org/zh-cn/docs/overview/what-is-seata/
2.1)Seata的三大角色
在seata的架构中,一共有三个角色:
TC-事务协调者。维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM-事务管理器。定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM-资源管理器。管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
其中TC为单独部署的Server服务端,TM和RM为嵌入到应用中的Client客户端。
2.2)分布式事务解决方案(两个步骤)
两阶段(2PC),两阶段是指完成整个分布式事务,划分成两个步骤完成
即 Prepare(提交事务请求)/commit/rollback(执行事务提交/回滚)。第一阶段:Prepare(提交事务请求):1.询问:协调者向所有参与者发送事务请求,询问是否可执行事务操作,然后等待各个参与者响应。2.执行:各个参与者接收到协调者事务请求后,执行事务操作(例如更新一个关系型数据库表中的记录),并将undo(元数据)和redo(提交数据)信息记录事务日志中。3.响应:如果参与者成功执行了事务并写入undo(元数据)和redo(提交数据)信息,则向协调者返回YES响应,否则返回NO响应。如果参与者宕机了,就不会返回响应。第二阶段:commit/rollback(执行事务提交/回滚):正常提交事务:1.commit:协调者向所有参与者发送commit请求。2.事务提交:所有参与者收到commit请求后,执行事务提交(redo),提交完成后释放事务执行期占用的所有资源。3.反馈结果:所有参与者事务提交后,向协调者发送响应。4.完成事务:接收到所有参与者的响应后,完成事务提交。中断事务:第一阶段执行过程中,部分参与者响应NO或者没有响应。1.rollback:协调者向所有参与者发送rollback请求。2.事务回滚:参与者收到rollback后,使用undo日志执行事务回滚,完成后释放事务执行期占用的所有资源。3.反馈结果:所有参与者事务回滚后,向协调者发送响应。4.中断事务:接收到所有参与者的响应后,完成事务中断。

在这里插入图片描述

2PC的问题:1.同步阻塞。参与者在等待协调者的指令时,其实是在等待其他参与者的响应,在此过程中,参与者是无法进行其他操作,也就阻塞了其运行。2.数据不一致。当协调者突然宕机,部分参与者没有接收到 commit/rollback请求,另一部分参与者接收到commit/rollback请求。这时数据就不再一致。
2.3)Seata AT模式(auto transcation)
AT模式是一种无侵入的分布式事务解决方案。
在AT模式下,用户只需要关注自己的业务SQL,用户的业务SQL作为第一阶段,Seata框架会自动生成事务的二阶段提交和回滚操作。

在这里插入图片描述

一阶段:在一阶段,Seata会拦截 用户的 业务SQL,首先解析SQL语句,获取业务SQL要执行的数据,在业务数据执行前,将其保存成“before image”,然后执行业务SQL,业务SQL执行之后,再将其保存成“after image”,最后生成锁。以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。

在这里插入图片描述
在这里插入图片描述

二阶段提交:二阶段如果是提交的话,因为业务SQL在一阶段已经提交至数据库,所以Seata框架只需要将一阶段保存的快照数据和锁删除,完成数据清理。

在这里插入图片描述
在这里插入图片描述

二阶段回滚:二阶段如果是回滚的话,Seata需要将一阶段已经执行的业务SQL还原。回滚方式是用 before image 还原业务数据。

在这里插入图片描述
在这里插入图片描述

3.搭建Seata-server

3.1)seata-server(TC)搭建(db存储模式+Nacos部署)
seata官网部署指南:https://seata.apache.org/zh-cn/docs/ops/deploy-guide-beginner/下载安装包:https://github.com/apache/incubator-seata/releases
本人Spring Cloud Alibaba版本是 2023.0.0.0-RC1所以选择Seata版本为seata-server-2.0.0.zip资源目录地址:https://github.com/apache/incubator-seata/tree/master/scriptclient:存放client端sql脚本 (包含 undo_log表) ,参数配置config-center:各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件server:server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置Server端存储模式(store.mode)现有file、db、redis、raft。file模式无需改动,直接启动即可。raft部署方式可查看:https://seata.apache.org/zh-cn/docs/ops/deploy-server-raft/注:file模式为单机模式,全局事务会话信息内存中读写并异步(默认)持久化本地文件root.data,性能较高;db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.
3.1.1)修改Server端配置
配置文件目录位置:seata\conf\application.yml。配置信息可以参考application.example.yml1.存储模式: db2.config(配置中心)/registry(注册中心):nacos3.nacos配置seataServer.properties

在这里插入图片描述

配置信息如下:
#  Copyright 1999-2019 Seata.io Group.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata
seata:config:# support: nacos, consul, apollo, zk, etcd3type: nacosnacos:server-addr: 127.0.0.1:8848namespace:group: SEATA_GROUPusername: nacospassword: nacos##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:data-id: seataServer.propertiesregistry:# support: nacos, eureka, redis, zk, consul, etcd3, sofatype: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername: nacospassword: nacos##if use MSE Nacos with auth, mutex with username/password attribute#access-key:#secret-key:store:# support: file 、 db 、 redis 、 raftmode: dbsession:mode: dblock:mode: dbdb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&allowMultiQueries=trueuser: rootpassword: 123456min-conn: 10max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 1000max-wait: 5000#  server:#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/**
创建数据库导入mysql脚本:
数据库脚本位置:seata\script\server\db

在这里插入图片描述
在这里插入图片描述

nacos配置seataServer.properties:
将config内容复制到nacos中并修改数据源信息。
文件位置:seata\script\config-center

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.2)启动并访问Server端
双击运行:seata-server.bat
目录位置:seata\bin

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

访问seata控制台:http://127.0.0.1:7091 账密默认为seata/seata

在这里插入图片描述

4.搭建Seata Client(项目整合Seata)

4.1)添加Seata依赖
<!-- SpringCloud Alibaba seata-->
<dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
</dependencies>
4.2)每个服务对应的数据库中添加undo_log表
CREATE TABLE IF NOT EXISTS `undo_log`
(`branch_id`     BIGINT       NOT NULL COMMENT 'branch transaction id',`xid`           VARCHAR(128) NOT NULL COMMENT 'global transaction id',`context`       VARCHAR(128) NOT NULL COMMENT 'undo_log context,such as serialization',`rollback_info` LONGBLOB     NOT NULL COMMENT 'rollback info',`log_status`    INT(11)      NOT NULL COMMENT '0:normal status,1:defense status',`log_created`   DATETIME(6)  NOT NULL COMMENT 'create datetime',`log_modified`  DATETIME(6)  NOT NULL COMMENT 'modify datetime',UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT ='AT transaction mode undo table';
ALTER TABLE `undo_log` ADD INDEX `ix_log_created` (`log_created`);
4.3)服务yml配置seata
#seata
seata:#事务分组 要和nacos seataServer.properties 中的service.vgroupMapping.default_tx_group 一致tx-service-group: default_tx_groupregistry:#配置seata的注册中心,告诉 seata client 怎么去访问seata servicetype: nacosnacos:server-addr: 127.0.0.1:8848#seata service 的 application: nameapplication: seata-serverusername: nacospassword: nacosgroup: SEATA_GROUPconfig:#配置seata的配置中心,可以读取关于seata client 的一些配置type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: SEATA_GROUPdata-id: seataServer.properties
4.4)业务方法添加@GlobalTransactional(rollbackFor = Exception.class)后开始测试吧

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

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

相关文章

ThreadLocal 源码详解

概述 ThreadLocal是一个java提供的本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射&#xff0c;各个线程之间的变量互不干扰&#xff0c;在高并发场景下&#xff0c;可以实现无状态的调用&#xff0c;特别适用于各个线程依赖不通的变量值完成操作…

美国政府首次发布《国家网络安全态势报告》

报告提到&#xff0c;不断演变的关键基础设施风险、勒索软件、供应链利用、商业间谍软件和AI是主要趋势&#xff1b;国家网络总监办公室同时公布了第二版《国家网络安全战略实施计划》&#xff0c;新增了31项倡议。 前情回顾美国深化网络安全战略 美国发布国家网络安全战略实施…

快团团怎么做帮卖团长/供货大团长(如何从小白到优质团长)?

一名小白想要成长为快团团的优质团长&#xff0c;可以遵循以下步骤和策略&#xff1a; 了解平台与注册成为团长&#xff1a; 首先&#xff0c;熟悉快团团平台的操作流程和规则。快团团是一个基于微信的小程序&#xff0c;专注于社区团购业务。通过微信扫描团长资源二维码或在快…

【爬虫基础1.1课】——requests模块上

目录索引 requests模块的作用&#xff1a;实例引入&#xff1a; 特殊情况&#xff1a;锦囊1&#xff1a;锦囊2: 这一个栏目&#xff0c;我会给出我从零开始学习爬虫的全过程。感兴趣的小伙伴可以关注一波&#xff0c;用于复习和新学都是不错的选择。 那么废话不多说&#xff0c…

​​​​【收录 Hello 算法】5.2 队列

目录 5.2 队列 5.2.1 队列常用操作 5.2.2 队列实现 1. 基于链表的实现 2. 基于数组的实现 5.2.3 队列典型应用 5.2 队列 队列&#xff08;queue&#xff09;是一种遵循先入先出规则的线性数据结构。顾名思义&#xff0c;队列模拟了排队现象&#xff0c;即…

利用香港多IP服务器进行大数据分析的潜在优势?

利用香港多IP服务器进行大数据分析的潜在优势? 在当今数据驱动的时代&#xff0c;大数据分析已经成为企业获取竞争优势的不二选择。而香港作为一个拥有世界级通信基础设施的城市&#xff0c;提供了理想的环境来部署多IP服务器&#xff0c;从而为大数据分析提供了独特的优势。…

2024中国(重庆)人工智能展览会8月举办

2024中国(重庆)人工智能展览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 【报名I59交易会 2351交易会 9466】 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在…

Spring Framework-简介

Spring Framework Java Spring是一个开源的Java应用框架&#xff0c;它的主要目的是简化企业级应用开发的复杂性。Spring框架为开发者提供了许多基础功能&#xff0c;使得开发者能够更专注于业务逻辑的实现&#xff0c;而不是底层的细节。 主要特点和功能&#xff1a; 控制反…

数据库脚本编写规范(SQL编写规范)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目 2 SQL书写规范 3 SQL编写原则 软件开发全文档获取&#xff1a;点我获取

全域运营是割韭菜吗?看完再下结论!

随着流量时代的到来&#xff0c;各大公私域平台中的流量争夺战日益激烈&#xff0c;商家和品牌实现流量变现的难度值也不断提高&#xff0c;运营人员的压力也逐渐增大。在此背景下&#xff0c;全域运营的兴起或许是一个契机&#xff0c;能够将所有人从内卷的状态中解救出来。而…

网络安全之OSPF进阶

该文针对OSPF进行一个全面的认识。建议了解OSPF的基础后进行本文的一个阅读能较好理解本文。 OSPF基础的内容请查看&#xff1a;网络安全之动态路由OSPF基础-CSDN博客 OSPF中更新方式中的触发更新30分钟的链路状态刷新。是因为其算法决定的&#xff0c;距离矢量型协议是边算边…

力扣刷题 day1

移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 看到这道题&#xff0c;是否第一个想法就是双指针&#xff0c;下面我们就来使用双指针来完成这道题. 图: 代码: java: // 移动 0 双指针public void moveZeroes(int[] nums) {for (int current 0, dest -1; …

前端框架 Vue 主要用来做什么的?

Vue.js 是一个流行的前端框架&#xff0c;主要用于构建交互式的用户界面。它的设计目标是通过简单的 API 提供高效的数据驱动视图层。Vue 具有响应式数据绑定和组件化的特性&#xff0c;使得开发者可以轻松地构建复杂的单页面应用 (SPA) 和动态网页。 1. 数据驱动视图 Vue 的…

Matlab如何导出高质量论文插图?科研效率UpUp第8期

当你用Matlab绘制了一张论文插图&#xff1a; 想要所见即所得&#xff0c;原封不动地将其保存下来&#xff0c;该怎么操作呢&#xff1f; 虽说以前总结过7种方法&#xff08;Matlab导出论文插图的7种方法&#xff09;&#xff0c;但要说哪一种可以满足上面的要求&#xff0c;想…

socket实现TCP UDP

1、socket通信建立流程 1.1、创建服务端流程 使用 socket 函数来创建 socket服务。 使用 bind 函数绑定端口。 使用 listen 函数监听端口。 使用 accept 函数接收客户端请求。 1.2、创建客户端流程 使用 socket 函数来创建 socket 服务。 使用 connect 函数连接到 socke…

TypeError: can only concatenate str (not “int“) to str

TypeError: can only concatenate str (not "int") to str a 窗前明月光&#xff0c;疑是地上霜。举头望明月&#xff0c;低头思故乡。 print(str_len len(str_text) : len(a)) 试图打印出字符串 a 的长度&#xff0c;但是在 Python 中拼接字符串和整数需要使用字符…

邮件代发邮箱API发送邮件时如何正确使用?

邮件代发API发送邮件如何使用&#xff1f;邮件代发的注意事项&#xff1f; 邮件代发邮箱API作为邮件发送的自动化工具&#xff0c;其正确使用对于提高工作效率、保障信息安全具有重要意义。下面&#xff0c;AokSend就来探讨一下在使用邮件代发邮箱API发送邮件时&#xff0c;应…

【Linux学习笔记】一篇文章彻底搞定 “Linux同步与互斥“ !

本章重点 1. 学会线程同步。 2 学会使用互斥量&#xff0c;条件变量&#xff0c;posix信号量&#xff0c;以及读写锁。 1、进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的…

Springboot项目使用redis实现session共享

1.安装redis&#xff0c;并配置密码 这里就不针对于redis的安装约配置进行说明了&#xff0c;直接在项目中使用。 redis在windows环境下安装&#xff1a;Window下Redis的安装和部署详细图文教程&#xff08;Redis的安装和可视化工具的使用&#xff09;_redis安装-CSDN博客 2…

C++青少年简明教程:C++程序结构

C青少年简明教程&#xff1a;C程序结构 一个简单的C程序源码如下&#xff1a; #include <iostream> using namespace std;int main() {cout << "Hello World" << endl;return 0; }下面解析一下。 1. #include <iostream> 这是一条预处理…