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.hqwc.cn/news/63466.html

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

相关文章

WebRTC | 音视频实时通信的本质

目录 一、音视频实时通信的两种指标 1. 实时通信延迟指标 2. 视频相关的基本概念 3. 音视频服务质量指标 二、解决实时通信的主要矛盾 1. 增加带宽 A. 提供更优质的接入服务 B. 保证云端网络的带宽和质量 C. 更合理的路由调度策略 2. 减少数据量 A. 采用更好的压缩算…

Metasploitable2靶机漏洞复现

一、信息收集 nmap扫描靶机信息 二、弱口令 1.系统弱口令 在Kali Linux中使用telnet远程连接靶机 输入账号密码msfadmin即可登录 2.MySQL弱口令 使用mysql -h 靶机IP地址即可连接 3.PostgreSQL弱密码登录 输入psql -h 192.168.110.134 -U postgres 密码为postgres 输入\…

10. Docker Swarm(一)

目录 1、前言 2、Docker Swarm体系架构 2.1、简单介绍 2.2、体系架构 3、简单使用 3.1、环境准备 3.2、初始化master节点 3.3、建立worker节点 3.4、查看集群的节点信息 3.5、部署应用 3.5.1、创建Dockerfile文件 3.5.2、构建镜像 3.5.3、将镜像上传到Docker仓库 …

web前端之JS

文章目录 介绍一、JS引入到文件1.1 嵌入到HTML文件中1.2 引入本地独立JS文件1.3 引入网络来源文件 二、JS的注释三、JS输出方式四、JS数据类型4.1 判断数据类型 typeof4.2 charAt返回指定位置的字符4.3 concat连接两个字符串4.4 substring从原字符串提取字符串并返回4.4 substr…

Vue输入框或者选择框无效,或者有延迟

问题剖析 使用Vue这种成熟好用的框架&#xff0c;一般出现奇奇怪怪的问题都是因为操作不当导致的&#xff0c;例如没有合理调用组件、组件位置不正确、没有合理定义组件或者变量、样式使用不当等等... 解决方案 如果你也出现了输入框输入东西&#xff0c;但是没有效果…

(二)结构型模式:1、适配器模式(Adapter Pattern)(C++实现示例)

目录 1、适配器模式&#xff08;Adapter Pattern&#xff09;含义 2、适配器模式应用场景 3、适配器模式的UML图学习 4、C实现适配器模式的示例 1、适配器模式&#xff08;Adapter Pattern&#xff09;含义 将一个接口转换为客户端所期待的接口&#xff0c;从而使两个接口…

最强自动化测试框架Playwright(11)- 录制视频

视频 使用playwright&#xff0c;您可以录制测试视频。 录制视频 视频在测试结束时在浏览器上下文关闭时保存。如果手动创建浏览器上下文&#xff0c;请确保等待 browser_context.close&#xff08;&#xff09;。 context browser.new_context(record_video_dir"vid…

互联网医院办理|沈阳互联网医院|医疗行业新机遇

互联网医院的办理不仅能为人们带来更便利、高效的医疗服务&#xff0c;更能缓解医疗资源紧张的问题&#xff0c;推动医疗服务的质量和效率提升。在这个充满信息化和科技变革的时代&#xff0c;互联网医院无疑是医疗行业向前迈进的重要一步。 1、提供全天候的医疗服务&#xff1…

重复delete 对象指针后的 异常调用栈怪异 解析

Release版VC6 MFC程序 程序正常退出时得到一个如下异常调用栈&#xff1a;​ 0:000> kb# ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong. 00 0019eb94 76124f2f 00c3afc8 0019ebdc 001…

Electron+vue3项目使用SQLite3数据库

SQLite 是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;我们不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不是一个独立的进程&am…

ChatGPT应用在律师行业需谨慎,南非有律师被它的幻觉误导了!

ChatGPT自去年以来大受欢迎&#xff0c;没想到它这么快会出现在法庭上。 最近&#xff0c;南非约翰内斯堡地区法院审理一个案件时&#xff0c;有律师因为使用ChatGPT生成的虚假参考资料而受到指责。[1] 根据《星期日泰晤士报》的报道&#xff0c;法院判决认为&#xff0c;该名…

IDEA Run SpringBoot程序步骤原理

这个文章不是高深的原理文章&#xff0c;仅仅是接手一个外部提供的阉割版代码遇到过的一个坑&#xff0c;后来解决了&#xff0c;记录一下。 1、IDEA Run 一个SpringBoot一直失败&#xff0c;提示找不到类&#xff0c;但是maven install成功&#xff0c;并且java -jar能成功ru…