CAP原则

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

分区性:

数据一致性

分布式事务协议——2PC

假设没有错误情况下:

假设其中某一参与者出错:

不管最后结果如何,第二阶段都会结束当前事务

分布式事务协议——3PC

Seata

seata术语

seata有四种模式:AT、TCC、Sage、XA,其中AT模式是最常用的模式

详情参见https://www.pianshen.com/article/34341263271/

AT模式具体实现步骤

实现步骤:

  • TM端使用@GolableTranscation进行全局事务开启、提交、回滚
  • TM开始RPC调用远程服务
  • RM端seata-client通过扩展DataSourceProxy,实现自动生成undo-log与TC上报
  • TM告知TC提交/回滚全局事务
  • TC通知RM各自执行commit/rollback操作,同时清除undo-log

win10启动seata,需要64位java8,如遇闪退情况需检查此问题

1.seata 数据源配置

下载seata程序包,此处版本为1.3.0

修改配置文件E:\soft\seata\seata\conf\file.conf


## 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.cj.jdbc.Driver"url = "jdbc:mysql://host:3306/seata?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai"user = "root"password = "xxx"minConn = 5maxConn = 30globalTable = "global_table"branchTable = "branch_table"lockTable = "lock_table"queryLimit = 100maxWait = 5000}## redis store propertyredis {host = "47.100.42.118"port = "6379"password = ""database = "0"minConn = 1maxConn = 10queryLimit = 100}}

此处修改默认配置为:seata数据源类型为db,并配置mysql数据源

如果用mysql作为数据源,需要初始化SQL建表,下面贴出:

DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table`  (`branch_id` bigint(20) NOT NULL,`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`transaction_id` bigint(20) NULL DEFAULT NULL,`resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`status` tinyint(4) NULL DEFAULT NULL,`client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`gmt_create` datetime(0) NULL DEFAULT NULL,`gmt_modified` datetime(0) NULL DEFAULT NULL,PRIMARY KEY (`branch_id`) USING BTREE,INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Table structure for global_table
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table`  (`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`transaction_id` bigint(20) NULL DEFAULT NULL,`status` tinyint(4) NOT NULL,`application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`timeout` int(11) NULL DEFAULT NULL,`begin_time` bigint(20) NULL DEFAULT NULL,`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`gmt_create` datetime(0) NULL DEFAULT NULL,`gmt_modified` datetime(0) NULL DEFAULT NULL,PRIMARY KEY (`xid`) USING BTREE,INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Table structure for lock_table
-- ----------------------------
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table`  (`row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`transaction_id` bigint(20) NULL DEFAULT NULL,`branch_id` bigint(20) NOT NULL,`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`gmt_create` datetime(0) NULL DEFAULT NULL,`gmt_modified` datetime(0) NULL DEFAULT NULL,PRIMARY KEY (`row_key`) USING BTREE,INDEX `idx_branch_id`(`branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

2.seata 注册配置

编辑E:\soft\seata\seata\conf\registory.conf

registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype = "nacos"nacos {application = "seata-server"serverAddr = "127.0.0.1:8848"# group = "test"namespace = "fcf48d9c-1b25-413a-b365-2fa20ad3568d"cluster = "default"username = ""password = ""}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 = "localhost"namespace = "fcf48d9c-1b25-413a-b365-2fa20ad3568d"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"}zk {serverAddr = "127.0.0.1:2181"sessionTimeout = 6000connectTimeout = 2000username = ""password = ""}etcd3 {serverAddr = "http://localhost:2379"}file {name = "file.conf"}
}

3.推送详细配置到nacos

进入nacos项目地址,下载配置文件,或复制粘贴到本地

https://github.com/seata/seata/tree/1.3.0/script/config-center

  • 在seata/script/config-center/中找到config.txt文件

  • 在seata/script/config-center/nacos/中找到nacos-config.sh脚本

下载完成后config.txt放在bin同级目录下,bin同级目录下新建script文件夹,将sh脚本放入其中

进入script目录,cmd:启动脚本

sh nacos-config.sh -h localhost -p 8848 -t fcf48d9c-1b25-413a-b365-2fa20ad3568d -g  STATE_GROUP -u nacos -w nacos

-h: nacos地址

-p: nacos端口

-t: 命名空间id

-g: 组名

-u -w: nacos账户名密码

在nacos上对应命名空间查看配置文件是否上传成功

4.启动seata

进入目录 E:\soft\seata\seata\bin 启动seata-server.bat,如遇闪退,可以在cmd命令行中执行bat启动程序,这种方式可以查看错误日志

创建一个RM

引入依赖

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>

seata配置

seata:application-id: seata-servertx-service-group: my_test_tx_groupconfig:type: nacosnacos:namespace: fcf48d9c-1b25-413a-b365-2fa20ad3568dserver-addr: localhost:8848group: STATE_GROUPusername: "nacos"password: "nacos"registry:type: nacosnacos:application: seata-serverserver-addr: localhost:8848# group:namespace: fcf48d9c-1b25-413a-b365-2fa20ad3568dusername: "nacos"password: "nacos"

RM的业务代码与其他普通项目并无区别…

创建一个TC

同样引入pom依赖、做好seata配置,与RM无异

@GlobalTransactional
public String deleteUser(){//微服务1userService.selectUser();//微服务2userService.delUser();int i = userMapper.deleteById("1");return i==1?"删除成功":"删除失败";
}

通过@GlobalTransactional注解进行全局事务管理,微服务一方失败都会导致全局回滚

password: "nacos"

RM的业务代码与其他普通项目并无区别......## 创建一个TC同样引入pom依赖、做好seata配置,与RM无异```java
@GlobalTransactional
public String deleteUser(){//微服务1userService.selectUser();//微服务2userService.delUser();int i = userMapper.deleteById("1");return i==1?"删除成功":"删除失败";
}

通过@GlobalTransactional注解进行全局事务管理,微服务一方失败都会导致全局回滚

Seata分布式事务相关推荐

  1. Spring Cloud Alibaba 综合应用:Seata 分布式事务实战教程

    在前面的章节,我们分别讲解了 Spring Cloud Alibaba 中主要的组成部分,其中包括:注册中心与配置管理组件 Nacos.Ribbon 客户端负载均衡.OpenFeign 与 Dubbo ...

  2. SpringCloud分布式事务,版本二:添加 Seata 分布式事务版本

    基于 Seata 1.4.0 版本 首先贴出此项目地址:Seata 分布式事务版本 先了未添加事务项目再看此版本:未添加事务版本 此文章是基于上一篇的项目基础上添加的内容,所以务必先看上一篇 Seat ...

  3. seata分布式事务回滚机制是如何实现的

    本文来说下seata分布式事务回滚机制是如何实现的 文章目录 概述 概述

  4. seata分布式事务协调管理器是如何实现的

    本文来说下seata分布式事务协调管理器是如何实现的 文章目录 概述 概述

  5. seata分布式事务一致性锁机制如何实现的

    本文来说下seata分布式事务一致性锁机制是如何实现的 文章目录 概述 概述

  6. 关于seata分布式事务框架的几个问题

    本文来说下关于seata分布式事务框架的几个问题 文章目录 概述 Seata 分布式事务解决方案比较 本文小结 概述 seata是两阶段提交事务,第一阶段解析业务sql并且生成对应快照,第二阶段是提交 ...

  7. SpringCloud微服务实战——搭建企业级开发框架(二十七):集成多数据源+Seata分布式事务+读写分离+分库分表

      读写分离:为了确保数据库产品的稳定性,很多数据库拥有双机热备功能.也就是,第一台数据库服务器,是对外提供增删改业务的生产服务器:第二台数据库服务器,主要进行读的操作.   目前有多种方式实现读写分 ...

  8. Seata分布式事务控制整合Mybatis-Plus导致事务控制失效

    解决方案 1. pom文件引入Druid数据源 <!--druid--> <dependency> <groupId>com.alibaba</groupId ...

  9. spring cloud 集成 seata 分布式事务

    spring cloud 集成 seata 分布式事务 基于 seata-server 1.6.x 序言 下载 seata-server 准备一个数据库 seata 专门为 seata-server ...

  10. springboot+dubbo+mybatisplus整合seata分布式事务

    介绍 默认采用AT模式的seata整合,项目已经传到码云,欢迎指点:https://gitee.com/itCjb/springboot-dubbo-mybatisplus-seata seata官网 ...

最新文章

  1. 零基础python必背代码-零基础小白Python入门必看:通俗易懂,搞定深浅拷贝
  2. stream 提取某字段_java8从list集合中取出某一属性的值的集合案例
  3. apache禁用不安全的http法_tomcat禁用不安全的HTTP方法
  4. python中的sklearn.svm.svr_python机器学习库scikit-learn:SVR的基本应用
  5. 鸿蒙系统适配的电脑,鸿蒙来了!华为正式发布操作系统 适配手机电脑多类型设备...
  6. Mysql 哈希索引
  7. maven五:查找jar包坐标,选择jar包版本
  8. IOS学习之斯坦福大学IOS开发课程笔记(第六课)
  9. 浅谈算法和数据结构: 十 平衡查找树之B树
  10. MVC模式中Controller控制器为什么是Servlet?怎么理解?
  11. setBounds()和setSize的区别
  12. c语言程序设计第一次月考考试重点,为什么说初三第一次月考很重要
  13. moviepy音视频剪辑:使用concatenate_videoclips和clips_array将多个视频合成一个顺序播放或同屏播放的视频
  14. 曙光“城市大数据平台”冲破数据孤岛、创造数据价值
  15. 视频教程-软件测试入门视频教程-软件测试
  16. 华为 博士 实习_华为2017年招聘2018届实习生
  17. FreeRTOS韦东山视频前八节学习笔记
  18. 简易Java web在线聊天-websocket
  19. can波特率及总线占有率计算
  20. 手机底部导航栏完整代码

热门文章

  1. 《战斗吧!机器人》,国内首档AI与机器人竞技真人秀发布会隆重召开
  2. SecureCRT通过按钮实现快捷执行命令
  3. android strictmode有什么作用,Android StrictMode介绍
  4. Eclipse下Tomcat自动加载web项目,无需重启了
  5. Windows更新出现8024402f错误代码的解决方法
  6. java ignorecase_Java compareToIgnoreCase() 方法
  7. docker安装+配置镜像+命令操作+数据卷+网络管理+DockerFile+镜像服务+项目部署+[高级使用]
  8. SpringMVC中文件上传中 servletFileUpload解析为空
  9. 应届毕业生的不知所措,面对“毕业即失业”的境地,这该怎么办?
  10. 数据结构和内存中堆和栈的区别