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: 7091

spring:
  application:
    name: seata-server

logging:
  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_logstash

console:
  user:
    username: seata
    password: seata

seata:
  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

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

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

相关文章

Vector - CAPL - 诊断模块函数(流控制帧续)

目录 CanTpGetFirstSequenceNumber & CanTpSetFirstSequenceNumber 代码示例 CanTpIsUseFlowControlSTmin & CanTpIsUseFlowControlSTmin & CanTpUseFlowControlSTmin CanTpIsUseFlowControlFrames & CanTpUseFlowControlFrames 代码示例 CanTpSetFlowC…

京东秋招攻略,备考在线测评和网申笔试

京东秋招简介 伴随着社会竞争越来越激烈&#xff0c;人们投递简历的岗位也变得越来越多元&#xff0c;而无论人们的选择面变成何样&#xff0c;那些知名度较高的企业&#xff0c;永远都备受关注&#xff0c;只要其一发布招聘公告&#xff0c;总有人第一时间踊跃报名。而作为这…

动力节点|Spring6框架学习教程,从基础到手撕源码一套打通

Spring框架已广泛应用于诸多Java应用程序的开发中&#xff0c;它提供了很多解决方案及最佳实践&#xff0c;简化了Java应用程序的开发过程并加速了开发。 Spring6.0版本是下一个十年的新开端&#xff0c;动力节点老杜精心打造全新升级版Spring6教程&#xff0c;手把手教学&…

网络安全进阶学习第十五课——Oracle SQL注入

文章目录 一、Oracle数据库介绍二、Oracle和MySQL的语法差异&#xff1a;三、Oracle的数据库结构四、Oracle的重点系统表五、Oracle权限分类1、系统权限2、实体权限3、管理角色 六、oracle常用信息查询方法七、联合查询注入1、order by 猜字段数量2、查数据库版本和用户名3、查…

【框架类】—Vue3的生命周期

一、生命周期的相关函数 onBeforeMount 页面渲染之前 和 onMounted渲染之后 示例 <template><div class"test"><div ref"el">组件初始化</div></div> </template> <script> //按需引入所需方法 import { ref,…

Android Camera预览画面变形问题

csdn 问题 安卓camera1在预览时&#xff0c;预览画面看起来被拉伸了&#xff0e; 如图&#xff0c;圆形的盖子&#xff0c;变成椭圆形了&#xff0e; 代码 默认流程&#xff0c;如下为大致的打开摄像头并进行预览显示的代码 private Camera mCamera null; private Surfa…

一文盘点 Zebec 生态的几个利好预期

Zebec Protocol 是目前商业进展最快的流支付体系&#xff0c;也是推动流支付向 Web2 世界发展的主要生态。目前&#xff0c;其已经与包括 Visa、Master 等支付巨头展开了合作&#xff0c;以推出银行卡的方式进一步向金融发达地区推出 Zebec Card 以拓展业务&#xff0c;前不久其…

Docker安装 Kibana

目录 前言安装Kibana步骤1&#xff1a;准备1. 安装docker2. 搜索可以使用的镜像。3. 也可从docker hub上搜索镜像。4. 选择合适的redis镜像。 步骤2&#xff1a;拉取 kibana 镜像拉取镜像查看已拉取的镜像 步骤3&#xff1a;创建容器创建容器方式1&#xff1a;快速创建容器 步骤…

1.物联网IWIP网络

一。以太网 1.nc模拟UDP &#xff08;1&#xff09;COMMBOX通信调试工具 &#xff08;2&#xff09; 控制台输入nc -u 127.0.0.1 8000,此时串口也可以获得数据 &#xff08;3&#xff09;串口调试程序发送字符串&#xff0c;电脑控制台也会展示同样字符串&#xff08;说明UDP…

Java基础篇--运算符

目录 算术运算符 赋值运算符 比较运算符 逻辑运算符 条件运算符&#xff08;?:&#xff09; instanceof 运算符 Java运算符优先级 在程序中经常出现一些特殊符号&#xff0c;如、-、*、、>等&#xff0c;这些特殊符号称作运算符。运算符用于对数据进行算术运算、赋值…

39 printf 的输出到设备层的调试

前言 在前面 printf 的调试 我们只是调试到了 glibc 调用系统调用, 封装了参数 stdout, 带输出的字符缓冲, 以及待输出字符长度 然后内核这边 只是到了 write 的系统调用, 并未向下细看 我们这里 稍微向下 细追一下, 看看 到达设备层面 这里是怎么具体的 impl 的 测试用例…

利用logstash将graylog日志传输到kafka中

1.graylog配置输出 在System-outputs&#xff0c;选择GELF Output&#xff0c;填写如下内容&#xff0c;其它选项默认 在要输出的Stream中&#xff0c;选择Manage Outputs 选择GELF Output&#xff0c;右边选择刚才创建好的test。 2.安装logstash&#xff0c;作为中间临时…

《Java-SE-第三十四章》之Optional

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页&#xff1a;KC老衲爱尼姑的博客主页 博主的github&#xff0c;平常所写代码皆在于此 共勉&#xff1a;talk is cheap, show me the code 作者是爪哇岛的新手&#xff0c;水平很有限&…

C#小轮子:Visual Studio自动编译Sass文件

文章目录 前言插件安装插件使用compilerconfig.jsonsass输入和css输出&#xff08;自动生成&#xff09;默认配置&#xff08;我不懂就不去动他了&#xff09; 前言 我们知道css文件用起来太麻烦&#xff0c;如果样式一多&#xff0c;嵌套起来用css样式就眼花缭乱。Sass使用层…

Kafka的下载和安装

一、Kafka下载和安装 下载地址&#xff1a;https://kafka.apache.org/downloads 下载完毕解压即可 linux解压命令tar -zxvf kafka_2.13-3.5.1.tgz&#xff0c;linux环境下指令是在\kafka_2.13-3.5.1\bin目录。 windows直接解压即可&#xff0c;windows环境下指令是在kafka_2.…

强化学习-信任区域策略优化和近端策略优化(第7章)

来源书籍&#xff1a; TENSORFLOW REINFORCEMENT LEARNING QUICK START GUIDE 《TensorFlow强化学习快速入门指南-使用Python动手搭建自学习的智能体》 著者&#xff1a;[美]考希克巴拉克里希南&#xff08;Kaushik Balakrishnan&#xff09; 译者&#xff1a;赵卫东 出版…

Rust 编程小技巧摘选(7)

目录 Rust 编程小技巧(7) 1. 交换变量 2. 翻转数组 3. for_each() 用法 4. 结构体 Display trait 5. HashMap 和 BTreeMap 6. 遍历输出哈希表 7. 分离奇数和偶数 8. 判断素数&#xff08;质数&#xff09; Rust 编程小技巧(7) 1. 交换变量 与python, go等语言用法类…

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…

【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java 正则表达式【匹配与分组基本原理】

简介 我们一般使用正则表达式是用来处理字符串的&#xff0c;不管是实际的开发中还是我们的算法竞赛中&#xff0c;使用正则表达式绝对可以大大提升我们的效率。 正则表达式&#xff08;regular expression&#xff09;其实就是对字符串进行模式匹配的技术。 快速入门 我们这里…