Seata - 入门笔记

news2025/2/21 23:30:46

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持久化配置.

3、步骤

在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: 注册到注册中心的ip
  • -p: Server rpc 监听端口
  • -m: 全局事务会话信息存储模式,file、db、redis,优先读取启动参数 (Seata-Server 1.3及以上版本支持redis)
  • -n: Server node,多个Server时,需区分各自节点,用于生成不同区间的transactionId,以免冲突
  • -e: 多环境配置参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html

 

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

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

相关文章

Python爬虫在电商数据挖掘中的应用

作为一名长期扎根在爬虫行业的专业的技术员,我今天要和大家分享一些有关Python爬虫在电商数据挖掘中的应用与案例分析。在如今数字化的时代,电商数据蕴含着丰富的信息,通过使用爬虫技术,我们可以轻松获取电商网站上的产品信息、用…

明年,HarmonyOS不再兼容Android应用!

2023年华为开发者大会,不知道各位老铁们是否观看了,一个震撼的消息就是,首次公开了HarmonyOS NEXT的概念,简而言之就是,这是一款专为开发者打造的预览版操作系统,旨在提供"纯正鸿蒙操作系统"的体…

2023年果粉装机必备软件有哪些?Macbook电脑需要安装什么软件

作为一名从Windows全面切换到Mac的果粉,在一开始的时候确实感到诸多不便,比如文件管理器操作别扭,鼠标移动不够跟手等等。 后来才发现,除了游戏,大多数问题都能用软件来解决。Mac虽然小众,但是用户群体有很…

84. 柱状图中最大的矩形

题目描述 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释:最…

林【2018】

关键字: BST插入叶子结点、ADT结伴操作、队列插入前r-1、哈希函数二次探测法(1,-1,4,-4)、队列元素个数、折半查找失败次数、广义表链表结构、B-树构建、单链表指定位置插入数组元素 一、判断 二、单选 h(49)+1,-1,+4,-4

什么是动态测试?

作为一名测试人员,要对各种测试方法了然于胸,今天这篇文章就来介绍下什么是动态测试。采用动静结合的测试方式,挖掘出程序中存在的问题,以更好地保证测试质量。同时,我也准备了一份软件测试视频教程,放在文…

水壶问题(力扣)数学 JAVA

有两个水壶,容量分别为 jug1Capacity 和 jug2Capacity 升。水的供应是无限的。确定是否有可能使用这两个壶准确得到 targetCapacity 升。 如果可以得到 targetCapacity 升水,最后请用以上水壶中的一或两个来盛放取得的 targetCapacity 升水。 你可以&…

echarts 横向柱状图

<template><div ref"chart" style"height: 100%"></div> </template><script> import * as echarts from "echarts"; var cate ["质量通病1", "质量通病2", "质量通病3", "质…

LeetCode 热题 100 JavaScript--160. 相交链表

/*** Definition for singly-linked list.* function ListNode(val) {* this.val val;* this.next null;* }*//*** param {ListNode} headA* param {ListNode} headB* return {ListNode}*/// 1、暴力解法 var getIntersectionNode function(headA, headB) {var p1 …

大英博物馆将世界历史带入 The Sandbox 元宇宙

又一个知名的、历史领域合作伙伴加入了我们的元宇宙生态系统&#xff01; 大英博物馆选择 The Sandbox 作为其首次进入元宇宙的合作平台。通过这次合作&#xff0c;我们的用户将能够通过全新的沉浸式体验来探索全球历史。 以下是您需要了解的一切&#xff01; 我们正在与大英…

测试工程师如何利用AIGC高效工作?Chat PDF辅助我们写测试用例和脚本

ChatPDF 是一种基于人工智能的工具&#xff0c;用于将 PDF 文档转换为可交互式的聊天式界面。它能够将静态的 PDF 文件转化为动态的聊天对话框&#xff0c;使用户可以通过对话的形式与文档进行交互。 ChatPDF 可以完成以下工作&#xff1a; 1. 将 PDF 文档转换为聊天式界面&am…

H. HEX-A-GONE Trails 2023“钉耙编程”中国大学生算法设计超级联赛(7)hdu7354

Problem - 7354 题目大意&#xff1a;有一棵n个点的树&#xff0c;A和B分别从点x&#xff0c;y开始&#xff0c;每轮可以移动到一个相邻节点&#xff0c;但如果某个节点有人访问过&#xff0c;则两人都不能访问那个节点&#xff0c;先没有点可走的人输&#xff0c;问A有没有必…

pytest之测试用例执行顺序

前言 在unittest框架中&#xff0c;默认按照ACSII码的顺序加载测试用例并执行&#xff0c;顺序为&#xff1a;09、AZ、a~z&#xff0c;测试目录、测试模块、测试类、测试方法/测试函数都按照这个规则来加载测试用例。 而 pytest 中的用例执行顺序与unittest 是不一样的&#…

CTF流量题解http4.pcapng

流量分析 导出http 打开报错 验证文件头&#xff0c;发现是zip。 图常片见里文可件能的包16含进:压制缩头包部,word,pdf JPG FF D8 FF E0/FF D8 FF E1 PNG 89 50 4E 47 GIF 47 49 46 38 ZIP 50 4B 03 04 RAR 52 61 72 21 MP3 49 44 33 0 改后缀 使用工具爆破。 git clone git…

牛客周赛 Round 6

A 游游的数字圈 题目大意 给定一个由数字字符组成的字符串&#xff0c;统计该字符串中出现的圆圈数量。其中数字0、6、9各有一个圆圈&#xff0c;数字8有两个圆圈。 思路分析 遍历字符串中的每个字符&#xff0c;对于每个字符&#xff0c;判断其是0、6、9则加1&#xff0c;是…

网络安全--mysql中事务锁以及事务隔离解析

一、事务锁 1、个人理解&#xff1a; 专一性和历史性&#xff0c;例如一个男人历史上是花心的&#xff0c;但当他成长后开启begin和update后变的专一了&#xff0c;多项事务也影响不到他了&#xff0c;直到水泥封心&#xff0c;只可被一个人查询在此我们进入正题&#xff1a;…

【代码】表格封装 + 高级查询 + 搜索 +分页器 (极简)

一、标题 查询条件按钮&#xff08;Header&#xff09; <!-- Header 标题搜索栏 --> <template><div><div class"header"><div class"h-left"><div class"title"><div class"desc-test">…

《动手学深度学习》优化算法学习习题

优化算法 梯度下降类 小批量随机梯度下降&#xff0c;通过平均梯度来减小方差 动量法 基础 泄露平均法&#xff1a;用来取代梯度的计算 β \beta β这个参数控制了取多久时间的平均值 上述推理构成了”加速”梯度方法的基础&#xff0c;例如具有动量的梯度。 在优化问题…

SpringMVC的架构有什么优势?——视图与模型(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

Codeforces Round 891 (Div. 3)

Array ColoringArray Coloring 题目大意 题目要求判断是否可以将数组元素分为两种颜色&#xff0c;使得两种颜色元素的和具有相同的奇偶性&#xff0c;并且每种颜色至少有一个元素被着色。 思路分析 可以通过统计数组中奇数和偶数的个数来判断是否满足条件。分析可知&#x…