seta-分布式事务介绍
一.前置知识
2.分布式事务
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上,且属于不同的应用,分布式事务需要保证这些操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。
3. 分布式一致性
3.1 引言
在分布式系统中,为了保证数据的高可用, 通常我们会将数据保留多个副本(replica), 这些副本会放置在不同的物理机器上。为了对用户提供正确的curd等语意,我们需要保证这些放置在不同物理机器上的副本是一致的。为了解决这种分布式一致性问题,提出了很多典型的协议和算法,比较著名的是二阶段提交协议,三阶段提交协议和paxos算法。
在分布式系统中,各个节点之间在物理上相互独立,通过网络进行沟通和协调。由于存在事务机制,可以保证每个独立节点上的数据操作可以满足ACID。但是,相互独立的节点之间无法准确地知道其他节点的事务执行情况。所以从理论上来讲,两台机器无法达到一致的状态。如果想让分布式部署的多台机器中的数据保持一致性,那么就要保证在所有节点数据的写操作,要么全部都执行,要么全部都不执行。但是,一台机器在执行本地事务的时候无法知道其他机器中的本地事务的执行结果,所以它也就不知道本次事务到底应该commit还是rollback。所以,常规的解决办法就是引入一个"协调者"的组件来统一调度所有分布式节点的执行。
3.2 二阶段提交(Two-phaseCommit)
https://blog.csdn.net/lengxiao1993/article/details/88290514
3.2.1 流程
二阶段提交的算法思路可以概括为: 参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。
二阶段是指: 第一阶段 - 请求阶段(表决阶段) 第二阶段 - 提交阶段(执行阶段)
(1) 请求阶段(表决):
事务协调者通知每个参与者准备提交或取消事务,然后进入表决过程,参与者要么在本地执行事务,写本地的redo和undo日志,但不提交,到达一种"万事俱备,只欠东风"的状态。请求阶段,参与者将告知协调者自己的决策: 同意(事务参与者本地作业执行成功)或取消(本地作业执行故障)
(2) 提交阶段(执行):
在该阶段,写调整将基于第一个阶段的投票结果进行决策: 提交或取消
当且仅当所有的参与者同意提交事务,协调者才通知所有的参与者提交事务,否则协调者将通知所有的参与者取消事务
参与者在接收到协调者发来的消息后将执行响应的操作
3.2.2 两阶段提交的缺点
1.同步阻塞问题。执行过程中,所有参与节点都是事务阻塞型的。
当参与者占有公共资源时,其他第三方节点访问公共资源不得不处于阻塞状态。
2.单点故障。由于协调者的重要性,一旦协调者发生故障。
参与者会一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。(如果是协调者挂掉,可以重新选举一个协调者,但是无法解决因为协调者宕机导致的参与者处于阻塞状态的问题)
3.数据不一致。在二阶段提交的阶段二中,当协调者向参与者发送commit请求之后,发生了局部网络异常或者在发送commit请求过程中协调者发生了故障,这回导致只有一部分参与者接受到了commit请求。
而在这部分参与者接到commit请求之后就会执行commit操作。但是其他部分未接到commit请求的机器则无法执行事务提交。于是整个分布式系统便出现了数据不一致性的现象。
3.2.3 两阶段提交无法解决的问题
当协调者出错,同时参与者也出错时,两阶段无法保证事务执行的完整性。
考虑协调者在发出commit消息之后宕机,而唯一接收到这条消息的参与者同时也宕机了。
那么即使协调者通过选举协议产生了新的协调者,这条事务的状态也是不确定的,没人知道事务是否被已经提交。
4.
分布式事务 理解什么是AT、TCC、Saga_强哥叨逼叨-CSDN博客_at、tcc、saga xa
二.seta
1.seata下载
下载中心 下载seata-service 版本与SpringCloudAlibaba对应
2.
2.1 db+nacos的方法部署高可用集群模式
2.1.1 db数据源的创建
修改conf/file.conf配置文件
mode 改成db(数据库需要5.7以上版本)
db的连接地址改成本机的,修改用户名和密码
## transaction log store, only used in seata-server
store {## store mode: file、db、redismode = "db"## file store propertyfile {## store location dirdir = "sessionStore"# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptionsmaxBranchSessionSize = 16384# globe session size , if exceeded throws exceptionsmaxGlobalSessionSize = 512# file buffer size , if exceeded allocate new bufferfileWriteBufferCacheSize = 16384# when recover batch read sizesessionReloadReadSize = 100# async, syncflushDiskMode = async}## database store propertydb {## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) etc.datasource = "druid"## mysql/oracle/postgresql/h2/oceanbase etc.dbType = "mysql"driverClassName = "com.mysql.jdbc.Driver"url = "jdbc:mysql://127.0.0.1:3306/seata_service"user = "root"password = "root"minConn = 5maxConn = 100globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}## redis store propertyredis {host = "127.0.0.1"port = "6379"password = ""database = "0"minConn = 1maxConn = 10maxTotal = 100queryLimit = 100}}
创建数据库seata_service
新建表 sql文件在seata-1.3.0\script\server\db
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(`xid` VARCHAR(128) NOT NULL,`transaction_id` BIGINT,`status` TINYINT NOT NULL,`application_id` VARCHAR(32),`transaction_service_group` VARCHAR(32),`transaction_name` VARCHAR(128),`timeout` INT,`begin_time` BIGINT,`application_data` VARCHAR(2000),`gmt_create` DATETIME,`gmt_modified` DATETIME,PRIMARY KEY (`xid`),KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(`branch_id` BIGINT NOT NULL,`xid` VARCHAR(128) NOT NULL,`transaction_id` BIGINT,`resource_group_id` VARCHAR(32),`resource_id` VARCHAR(256),`branch_type` VARCHAR(8),`status` TINYINT,`client_id` VARCHAR(64),`application_data` VARCHAR(2000),`gmt_create` DATETIME(6),`gmt_modified` DATETIME(6),PRIMARY KEY (`branch_id`),KEY `idx_xid` (`xid`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(`row_key` VARCHAR(128) NOT NULL,`xid` VARCHAR(96),`transaction_id` BIGINT,`branch_id` BIGINT NOT NULL,`resource_id` VARCHAR(256),`table_name` VARCHAR(32),`pk` VARCHAR(36),`gmt_create` DATETIME,`gmt_modified` DATETIME,PRIMARY KEY (`row_key`),KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDBDEFAULT CHARSET = utf8;
2.1.2 修改registry.conf
注册中心改成nacos
type = “nacos”
修改配置中心为nacos,默认为file
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"loadBalance = "RandomLoadBalance"loadBalanceVirtualNodes = 10nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"group = "SEATA_GROUP"namespace = ""cluster = "default"username = "nacos"password = "nacos"}eureka {serviceUrl = "http://localhost:8761/eureka"application = "default"weight = "1"}redis {serverAddr = "localhost:6379"db = 0password = ""cluster = "default"timeout = 0}zk {cluster = "default"serverAddr = "127.0.0.1:2181"sessionTimeout = 6000connectTimeout = 2000username = ""password = ""}consul {cluster = "default"serverAddr = "127.0.0.1:8500"}etcd3 {cluster = "default"serverAddr = "http://localhost:2379"}sofa {serverAddr = "127.0.0.1:9603"application = "default"region = "DEFAULT_ZONE"datacenter = "DefaultDataCenter"cluster = "default"group = "SEATA_GROUP"addressWaitTime = "3000"}file {name = "file.conf"}
}config {# file、nacos 、apollo、zk、consul、etcd3type = "nacos"nacos {serverAddr = "127.0.0.1:8848"namespace = ""group = "SEATA_GROUP"username = "nacos"password = "nacos"}consul {serverAddr = "127.0.0.1:8500"}apollo {appId = "seata-server"apolloMeta = "http://192.168.1.204:8801"namespace = "application"apolloAccesskeySecret = ""}zk {serverAddr = "127.0.0.1:2181"sessionTimeout = 6000connectTimeout = 2000username = ""password = ""}etcd3 {serverAddr = "http://localhost:2379"}file {name = "file.conf"}
}
2.1.3 修改 script\config-center中的config.txt文件,并注入到nacos的配置中心
启动seata-1.3.0\script\config-center\nacos下的脚本
三.seta-client搭建
3.1 在所有与分布式事务有关的参与者中加入依赖
<!--分布式事务--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>
3.2 在与分布式事务相关的数据库中加入undo_log表
-- for AT mode you must to init this sql for you business database. the seata server not need it.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 = InnoDBAUTO_INCREMENT = 1DEFAULT CHARSET = utf8 COMMENT ='AT transaction mode undo table';
3.3 Seata配置(application.yml)
与分布式事务相关的配置文件中都需要加入配置信息
spring:cloud:alibaba:seata:tx-service-group: my_test_tx_group #自定义事务组名称需要与seata-server中的对应 客户端和服务端都要在同一个tx-service-group事务组里!
SpringCloudAlibaba版本在2.21以上可以使用这种方式配置,无需复制文件到resource中
# 配置seata的配置中心与注册中心
seata:registry:type: nacosnacos:server-addr: 127.0.0.1:8848application: seata-service #改了seata的服务名需要修改namespace: nacospassword: nacosgroup: SEATA_GROUP #seata-service的分组名config:type: nacosnacos:server-addr: 127.0.0.1:8848namespace: nacospassword: nacosgroup: SEATA_GROUP #seata-service的分组名
3.4 在调用方的业务方法上加上全局事务注解@GlobalTransactional
seta-分布式事务介绍相关推荐
- 【转载】分布式事务 介绍
转载地址:https://www.jianshu.com/p/16b1baf015e8 不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新 ...
- Alibaba seata 分布式事务介绍及配置使用
一.介绍 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata 将为用户提供了 AT.TCC.SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方 ...
- jta mysql_JTA 使用 MySQL 分布式事务
假定在MySQL实例1上有表 create table person( id int, name varchar(32) ) MySQL实例2上也有一张同样的表,现在从实例1中的 person 表中删 ...
- 亿级流量 | 蚂蚁金服分布式事务实践解析
<SOFA:Channel/>,有趣实用的分布式架构频道. 本文根据 SOFAChannel#12 直播分享整理,主题:蚂蚁金服分布式事务实践解析.回顾视频以及 PPT 查看地址见文末. ...
- 分布式事务实践 解决数据一致性 分布式事务实现,模式和技术
分布式事务实现,模式和技术 分布式事务实现,模式和技术 介绍分布式事务的定义.原则和实现原则,介绍使用Spring框架实现分布式事务的几种方式,包括使用JTA.Spring事务同步.链式事务等,并通过 ...
- 分布式事务解决方案,Seata的基本配置和使用
文章目录 1. 分布式事务介绍 ①:本地事务 ②:分布式事务 ③:常见的分布式事务解决方案 3. 2PC与3PC ①:2PC与3PC的区别 3. Seata介绍 ①:Seata的三种角色 ②:Seat ...
- 还不理解“分布式事务”?这篇给你讲清楚!
" 这篇文章将介绍什么是分布式事务,分布式事务解决什么问题,对分布式事务实现的难点,解决思路,不同场景下方案的选择,通过图解的方式进行梳理.总结和比较. 相信耐心看完这篇文章,谈到分布式事务 ...
- 分布式事务概述 (资料)
2019独角兽企业重金招聘Python工程师标准>>> 什么是分布式系统 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为 ...
- 【微服务入门】分布式事务详解及seata的使用
一文读懂分布式事务 微服务中的分布式事务问题 1 分布式事务介绍 1.1 什么是事务 1.2 本地事务 1.3 什么是分布式事务 1.3.0 假如没有分布式事务 1.4 分布式事务系统架构 1.4.1 ...
- 常用的分布式事务解决方案
首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 常用的分布式事务解决方案 凌澜星空 2018-03-11 14:44:55 75315 ...
最新文章
- 分布式事务+DDD+负载均衡+服务治理已撸!微服务不就这点事?
- UITableView当数据很少的时候,去掉多余的cell分割线
- Linux服务-FTP文件服务器部署
- 使用PowerDesigner做数据库设计(一)
- javascript中Date对象的初始化方法
- 只存活了9天,谷歌AI伦理委员会解散了:严重低估员工的战斗力
- ChannelOption.TCP_NODELAY, true-浅谈tcp_nodelay的作用
- 电商购物核心架构演进:谁说架构思路会过时?
- 实用主义学python_麻瓜编程《实用主义学Python》课程全集下载地址 – 爱学知识网...
- java常见的异常_Java常见的10个异常
- 信号灯绿波服务器,主干道绿波与红波控制策略
- vue项目打包成app
- 禁用计算机账户控制,电脑关闭uac用户账户控制方法:如何禁用用户账户控制功能...
- 深圳大学毕业答辩PPT模板
- LoadRunner牛刀小试
- react-native >0.69版本 链接@ant-design/icons-react-native
- C语言修改dos窗口的大小
- 用于播放视频的Html5元素是,HTML5多媒体播放video元素与audio元素详解
- 桃源网络硬盘.Net sql注入漏洞
- python爬虫—— 抓取今日头条的街拍的妹子图
热门文章
- VUE3项目-飞机大战3
- C语言 跑飞位置,DSP程序跑飞的问题 - C2000™︎ 微控制器论坛 - C2000 微控制器 - E2E™ 设计支持...
- 天津大学免费上网,IPV4及IPV6同时共享的解决方案
- JAVA基础大全(实用)
- 《大象——thinking in UML》
- PDF转换成图片(Java pdfbox实现 附中文乱码解决方案)
- 关于qt5.10.0设置图片重影问题
- 如何判断邮箱号格式是否正确
- 从纸带到U盘:移动存储介质的发展史
- 域控制器组策略:域用户加入域,禁止USB移动存储