Seata - 入门笔记
1、事务
访问并可能更新数据库中数据库中各种数据线的一个程序执行单元
原子性:事务是一个不可分割的工作单位,一个事务要么都做要么都不做
一致性:必须是使数据库从一个一致性到另一个一致性的状态,中间状态不能被观察到
隔离性:一个事务的执行不能被其他事务干扰
持久性:一个事务一旦提交,对数据库中的数据的改变是永久的
2、本地事务
@Transational
大多数场景下,我们的应用都只需要操作单一的数据库,称为本地事务
3、常见分布式事务解决方案
- seata
- 消息队列
- saga
- XA
都是“两阶段(2Pc)”,两阶段是指完成整个分布式事务,划分为两个步骤
这四种常见的解决方案,分别对应分布式的四种模式:AT、TCC、Saga、XA
一、概念
1、Seata
Seata是一款开源的分布式事务解决方案,提供高性能和简单已用的分布式事务服务。Seata将用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式解决方案。
官网:http://seata.io/zh-cn/index.html
源码:https://github.com/seata/seata
2、三大角色
- TC(Transaction Coordinator):事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚
- TM(Transaction Manager):事务管理器
定义全局事务的范围:开始全局事务提交或回滚全局事务
- RM(Resource Manager):资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚
二、二阶段提交协议
三阶段提交协议3PC难实现,主流还是2PC协议。
2PC两阶段提交(Prepare和Commit)
- 询问:协调者向所有参与者发送事务请求,询问是否可执行事务操作,然后等待各个参与者的响应
- 执行:各个参与者接收到协调者事务请求后,执行事务操作,并将undo和redo信息记录事务日志
- 响应:如果参与者成功执行了事务并写入Undo和redo信息,则向协调者返回YES响应,否则返回NO响应
遇到的问题:
同步阻塞:参与者在等待协调者的指令时,其实实在等待其他参与者的响应,此过程中,参与者是无法进行其他操作的,也就是阻塞了运行,如果存在网络异常等原因会一直阻塞下去
单点:在2PC中,一切请求都来自协调者,所以协调者的地位是至关重要的,如果协调者宕机,参与者会一直阻塞并且占用事务资源。如果协调者也是分布式,使用选主方式提供服务,俺么在一个协调者挂掉后,可以获取另一个协调者继续后续的服务。但是新的协调者无法知道上一个事务的全部状态信息,所以无法顺序处理上一个事务
数据不一致:commit事务过程中commit请求和rollback请求可能因为协调者宕机成协调者与参与者网络问题丢失,导致部门参与者没有收到请求,而其他参与者已经执行了,导致数据不一致
环境可靠性依赖:协调者prepare请求发出后,等待响应,如果有参与者宕机或网络中断,都会导致协调者无法收到所有参与者的响应,那么2PC中,协调者会等到一定时间,超时后触发事务中断,这个过程中,协调者和其他参与者都是阻塞。
三、AT模式(Auto transcation)
无侵入的分布式事务解决方案
- 一阶段:Seata会拦截业务SQL,解析SQL语句,找到SQL要更新的业务数据,在业务数据被更新前,保存成“before image”(相当于undo),然后执行“业务SQL”更新业务数据,在业务数据更新之后,在保存成“after image”,最后生成行锁。以上操作在一个数据库事务内完成,保证一阶段操作的原子性。
- 二阶段提交:如果是提交的胡啊,因为业务SQL在一阶段已经提交至数据库,所以seata框架只需要将一阶段保存的快照数据和行锁删掉,完成数据清理。如果是回滚的话,需要回滚一阶段已经执行的业务SQL还原业务数据,回滚方式是用before image,在还原前要首先校验脏写,对比数据库当前业务数据和after image,如果两个数据完全一致就说明没有脏写,可以还原业务数据,如果不一致说明有脏写,就需要人工处理。
四、TCC模式
- 侵入性强,并且自己实现相关事务控制逻辑
- 整个过程基本没有锁,性能更强
需要用户根据自己的业务场景实现try、confirm和cancel三个操作。事务发起方在一阶段执行try方式,在二阶段提交执行confirm方法,二阶段回滚执行cancel方法。
五、DEMO
Seata分TC、TM和RM三个角色,TC(Server端)为单独服务端部署,TM和RM(Client端)由业务系统集成。
1、资源目录
- client:存放client端sql脚本 (包含 undo_log表) ,参数配置
- config-center:各个配置中心参数导入脚本,config.txt(包含server和client,原名nacos-config.txt)为通用参数文件
- server:server端数据库脚本 (包含 lock_table、branch_table 与 global_table) 及各个容器配置
2、Server端
Server端存储模式(store.mode)现有file、db、redis三种(后续将引入raft,mongodb)
- file模式(默认)为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;
- db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;
- redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.
步骤
在seata官网的下载页面,可以查询到对应支持的springboot版本号
这里使用的是springboot2.7.13,seata对应版本1.5.2,win上配置,DB+NOCOS
1)启动包
下载后解压缩
2)修改store.mode
启动包: seata-->conf-->application.yml,修改store.mode="db或者redis"
启动包: seata-->conf-->application.example.yml中附带额外配置,将其db|redis相关配置复制至application.yml,进行修改store.db或store.redis相关属性。
server:
port: 7091spring:
application:
name: seata-serverlogging:
config: classpath:logback-spring.xml
file:
path: ${user.home}/logs/seata
extend:
logstash-appender:
destination: 127.0.0.1:4560
kafka-appender:
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstashconsole:
user:
username: seata
password: seataseata:
config:
type: nacos
nacos:
server-addr: 127.0.0.1:8848
namespace:
group: SEATA_GROUP
username: nacos
password: nacos
data-id: seataServer.yml
registry:
type: nacos
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
group: SEATA_GROUP
namespace:
cluster: default
username: nacos
password: nacos
store:
mode: db
db:
datasource: druid
db-type: mysql
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/seata_server?rewriteBatchedStatements=true
user: root
password: root
min-conn: 5
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 100
max-wait: 5000
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login
3)建表
全局事务会话信息由3块内容构成
全局事务 | global_table |
分支事务 | branch_table |
全局锁 | lock_table |
4) config.txt
\seata-server-1.5.2\seata\script\config-center\config.txt
其他的例如数据库、redis根据自己的配置更改
本地登录:http://localhost:8848/nacos
# 注意:配置事务=配置事务分组名称default
# Seata 事务分组
service.vgroupMapping.default_tx_group=default
5)注册到nacos中
# 本地127.0.0.1可以直接运行
\seata-server-1.5.2\seata\script\config-center\nacos\nacos-config.sh
# 远程服务端
sh ${SEATAPATH}/script/config-center/nacos/nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -T 5a3c7d6c-f497-4d68-a71a-2e5e3340b3ca
- -h:host,服务端ip地址,默认localhost
- -p:port,nacos端口号,默认值8848
- -g:配置分组,默认值为SEATA_GROUP
- -t:组合信息,对应Nacos的命名空间ID字段,默认值为空
6)启动服务
本地win直接运行
seata-server-1.5.2\seata\bin\seata-server.bat
如果是远端服务器
seata-server.sh -h 127.0.0.1 -p 8091 -m db -n 1 -e test
参数 | 全写 | 作用 | 备注 |
-h | --host | 指定在注册中心注册的IP | 不指定获取当前的IP,外部访问不熟在云环境和容器中的sevrer建议指定 |
-p | --port | 指定server启动的端口 | 默认8091 |
-m | --storeMode | 事务日志存储方式 | 支持file\db\redis,默认file (Seata-Server 1.3及以上版本支持redis) |
-n | --serverNode | 只用seata-server的节点ID | 默认1 |
-e | --seataEnv | 指定seata-server运行环境 | 参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html |
3、Client端
步骤
1)建表
2)依赖
版本说明:https://github.com/alibaba/spring-cloud-alibaba/wiki
官方步骤:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
【注意】网上学习视频很多,有些时间很老,版本不适用你现在使用的springboot或者cloud,主要还是要多看官网的给的案例步骤,以及对照版本,否则版本之间可能会存在很多报错。
最开始使用的是seata-spring-boot-starter,全局事务开启后,发现product还是不能回滚,跨服务传递XID不同,所以没有回滚。看了一部分解决方法都没有解决,只有传递XID或者配置拦截,感觉不是最好的解决方式。最后参考官网后,发现以下,就改用了包。
- 依赖spring-cloud-alibaba-seata,内部集成了seata,并实现了xid传递
<!-- 微服务 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.7.13</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.7</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2021.0.1.0</version><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.2</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><version>2021.0.5.0</version><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><!--各个服务上单独添加--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
3)配置文件
#以order为例,product同理
server.port=1224
spring.application.name=orderspring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3308/seata?useSSL=false&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=rootspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848seata.tx-server-gropup=order-seata-service-groupseata.registry.type=nacos
seata.registry.nacos.server-addr=127.0.0.1:8848
seata.registry.nacos.application=seata-server
seata.registry.nacos.username=nacos
seata.registry.nacos.password=nacos
seata.registry.nacos.group=SEATA_GROUPseata.config.type=nacos
seata.config.nacos.server-addr=127.0.0.1:8848
seata.config.nacos.username=nacos
seata.config.nacos.password=nacos
seata.config.nacos.group=SEATA_GROUPmybatis.mapper-locations=classpath:mapper/*.xmlmybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
sql.showSjSql=true
4)代码
//启动类加上,远程调用
@EnableFeignClients
@EnableDiscoveryClien
相关文章:

Seata - 入门笔记
1、事务 访问并可能更新数据库中数据库中各种数据线的一个程序执行单元 原子性:事务是一个不可分割的工作单位,一个事务要么都做要么都不做 一致性:必须是使数据库从一个一致性到另一个一致性的状态,中间状态不能被观察到 隔离…...
springboot使用aop排除某些方法,更新从另外一张表,从另外一张表批量插入
AOP 在Spring Boot中使用AOP时,如果想要排除某些方法不被切面所影响,可以通过使用切面表达式中的!within关键字来实现。以下是一个示例: Aspect Component public class MyAspect {Before("execution(* com.example.service.*.*(..)) …...
Go 语言面试题(二):实现原理
文章目录 Q1 init() 函数是什么时候执行的?Q2 Go 语言的局部变量分配在栈上还是堆上?Q3 2 个 interface 可以比较吗?Q4 两个 nil 可能不相等吗?Q5 简述 Go 语言GC(垃圾回收)的工作原理Q6 函数返回局部变量的指针是否安全ÿ…...

SAP MM学习笔记16-在库品目评价
在库品目评价是指评估物料。具体比如物料价格,数量,保管场所等发生变化的时候,判断是否发生了变化,要不要生成 FI票,用哪个FI科目来进行管理等内容就叫在库品目评价。 在库品目评价有很多层级,这里先讲3兄弟…...

Azure通过自动化账户实现对资源变更
Azure通过自动化账户实现对资源变更 创建一个自动化账户第一种方式 添加凭据(有更改资源权限的账户,没有auth认证情况)创建一个Runbook,测试修改 AnalysisServices 定价层设置定时任务:开始定时任务: 第二种…...
使用luarocks安装cjson并使用cjson
1.luarocks安装 wget https://luarocks.org/releases/luarocks-3.3.1.tar.gz --no-check-certificatels -lrthtar -xvf luarocks-3.3.1.tar.gz mv luarocks-3.3.1 /usr/local/cd /usr/local/luarocks-3.3.1/./configure --prefix/usr/local/luarocks-3.3.1 vim /etc/profilePAT…...

【已解决】mac端 sourceTree 解决remote: HTTP Basic: Access denied报错
又是在一次使用sourcetree拉取或者提交代码时候,遇到了sourcetree报错; 排查了一会,比如查看了SSH keys是否有问题、是否与sourcetree账户状态有问题等等,最终才发现并解决问题 原因: 因为之前公司要求企业gitlab中…...

javaee dom4j读取xml文件
引入jar包 dom4j-1.6.1.jar 创建xml文件 <?xml version"1.0" encoding"UTF-8"?> <books><book id"1"><title ID"t1">背影</title><price>88</price><author>三毛</author>…...
各类背包问题
1、0-1背包问题 (1)用二维数组动态规划 #include<bits/stdc.h> using namespace std; int m,n; int w[50],c[50]; int dp[210][210]; int main() {cin>>m>>n;for(int i1;i<n;i){cin>>w[i]>>c[i];}for(int i1;i<n;…...
《练习100》91~95
题目91 # 自动生成字符串 # a [小马,小羊,小鹿] # b [草地上,电影院,家里] # c [看电影,听音乐,吃晚饭] # 随机生成三个0~2的数字,若是1,0,2 ,则输出: 小羊在草地上吃晚饭 import random a [小马,小羊,小鹿] b […...

3.6 Spring MVC文件上传
1. 文件上传到本地 实现方式 Spring MVC使用commons-fileupload实现文件上传,注意事项如下: l HTTP请求方法是POST。 l HTTP请求头的Content-Type是multipart/form-data。 SpringMVC配置 配置commons-fileupload插件的文件上传解析器CommonsMultip…...

# X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系
X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系 很多人对于他们是啥是傻傻分不清的,我做了个表格供大家参考。 摘抄: X11是X Window System Protocol, Version 11(RFC1013),是X server和X client之间的通…...

rknn3588如何查看npu使用情况
cat /sys/kernel/debug/rknpu/load在Linux中,你可以使用一些工具和命令来绘制某一进程的实时内存折线图。一个常用的工具是gnuplot,它可以用来绘制各种图表,包括折线图。 首先,你需要收集进程的实时内存数据。你可以使用pidstat命…...

“Can‘t open perl script configure : No such file or directory”的解决办法
编译OpenSSL的时候执行到 perl configure 时提示找不到configure, 然后在网上搜了搜,大家给的解决办法一般都是说设置环境变量或者指定configure路径再执行;我试了都不行, 最后我把perl卸了重装就正常了; 然后我换了…...

ChatGLM2-6B在windows下的部署
2023-08-10 ChatGLM2-6B在windows下的部署 一、部署环境 1、Windows 10 专业版, 64位,版本号:22H2,内存:32GB 2、已安装CUDA11.3 3、已安装Anaconda3 64bit版本 4、有显卡NVIDIA GeForce RTX 3060 Laptop GPU …...

nodejs+vue+elementui学生档案信息管理系统_06bg9
利用计算机网络的便利,开发一套基于nodejs的大学生信息管理系统,将会给人们的生活带来更多的便利,而且在经济效益上,也会有很大的便利!这可以节省大量的时间和金钱。学生信息管理系统是学校不可缺少的一个环节,其内容直…...
Nginx location
location块是nginx配置文件中,配置在http块中的server块中,匹配的是uri location匹配uri的方式 : 精确匹配: location /[ ...} 正则匹配: location - /{ ...} 一般匹配: location /{ ....} 匹配的规则: :精确匹…...
数据库字段命名导致的SQL报错
1.表设计 create table variables (id bigint not null comment 主键,business_key varchar(128) null comment 业务key,key varchar(128) null comment Map中的key,value varchar(255) null comment…...

【办公自动化】使用Python一键提取PDF中的表格到Excel
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

【基础类】—原型链系统性知识
一、创建对象有几种方法 字面量创建对象 1-1. 什么是字面量 字面量就是所见即所,指的是常量;用来为变量赋值时的常数量 代码例子:123;‘ABC’, {name: ‘张三’}, undefined , true 生活例子:门店的招牌&a…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...