以前做视频的网站吗,淘宝上面如何做网站,长沙网站建设电话,东莞沙田最新消息Seata Sea学习分布式事务Seata二阶段提交协议AT模式TCC模式 Seata服务搭建Seata Server#xff08;事务协调者TC#xff09;环境搭建seata服务搭建-db数据源seata服务搭建-nacos启动seata服务 分布式事务代码搭建-client端搭建接入微服务应用 Sea学习 事务#xff1a;事务是… Seata Sea学习分布式事务Seata二阶段提交协议AT模式TCC模式 Seata服务搭建Seata Server事务协调者TC环境搭建seata服务搭建-db数据源seata服务搭建-nacos启动seata服务 分布式事务代码搭建-client端搭建接入微服务应用 Sea学习 事务事务是访问数据库并更新数据库中各项数据的一个程序执行单元。在关系数据库中一个事务由一组或多组SQL语句组成。事务应该具有4个属性原子性、一致性、隔离性、持久性。例如更新商品的接口这就是一个事务事务是对程序而言的。 原子性事务是一个不可分割的工作单元事务中包括的诸多操作要么都做要么都不做。一致性保持数据的一致隔离性一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的并发执行的各个事务之间不能互相干扰。隔离性又分为四个级别来保证事务之间的隔离性读未提交、读已提交、可重复读、串行化(事务串行执行不会产生并发问题)持久性一个事务执行并提交后就持久到数据库 本地事务大多数场景下我们的应用都只需要操作单一的数据库这种情况下的事务称之为本地事务。本地事务的ACID特性由数据库直接支持。
分布式事务
两种分布式事务场景1、同一服务不同数据库2、同一数据库不同服务此时都会产生分布式事务的问题。此时用本地数据库事务是无法支持分布式事务的。此时用Seata处理分布式事务问题
Seata seata的三大角色 在seata的架构中一共有三个角色 TC:事务协调者TM:事务管理器RM:资源管理器 管理分支事务处理的资源与TC交谈以注册分支事务的状态并驱动分支事务提交或回滚。其中TC为单独部署的server服务端TM和RM为嵌入到应用中的client客户端。
二阶段提交协议
常见的分布式事务解决方案
seata阿里分布式事务框架消息队列sagaXA 他们都有一个共同点都是遵循二阶段协议2PC。两阶段是指完成整个分布式事务划分成两个步骤完成。 1、准备阶段在这个阶段事务的协调者会向所有涉及的数据库或者资源管理器发送准备请求。每个数据库或者资源管理器收到准备请求后会执行相应的操作并且记录准备状态。如果准备成功就向协调者发送准备就绪的ask。协调者等待所有参与者都发送准备就绪的信号如果有任何一个参与者未能准备就绪或者出现了错误协调者将会发送回滚请求给所有参与者。 提交阶段如果所有参与者都准备就绪协调者会向他们发送提交请求。参与者接收到提交请求后会正式提交事务并且释放相关资源。如果有任何一个参与者未能接收到请求或者出现了错误协调者将会发送回滚请求给所有参与者。 图例第一阶段 第二阶段 就像是军训一样准备阶段教官让所有同学都立正站好所有同学都得对齐站好谁没有站好全部同学都得重新立正直到所有同学都准备好然后训练阶段同学们都站一排齐步走只要有一个没走齐的就重新开始已经尽力去解释了我相信即使没有学过计算机的应该也知道这玩意是什么了嘿嘿看着是不是毫无压力 AT模式 一阶段 befrore image:将要更新的数据查询出来。afer image:事务执行后将执行完的数据查出来 二阶段 二阶段提交 因为一阶段已经完成了提交动作所以二阶段如果没有异常则直接删除before image、after image、行锁 二阶段回滚 根据before image拿到逆向sql回滚数据回滚完成后删除befor image、after image、行锁
TCC模式 Seata服务搭建 Seata分TC、TM、RM三个角色其中TC为单独服务端部署TM和RM由业务系统引入依赖来进行集成。 Seata Server事务协调者TC环境搭建 seata服务搭建-db数据源
下载安装包 2.2.5对应的seata包时1.3.0下载地址https://github.com/apache/incubator-seata/releases?page2 修改server端存储模式打开config/file.conf修改mode“db”修改数据库连接信息创建数据库新建表可以去seata提供的资源信息中下载
## transaction log store, only used in seata-server
store {## store mode: file、db、redismode db## 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 mysqldriverClassName com.mysql.jdbc.Driverurl jdbc:mysql://192.168.184.1:3306/seatauser rootpassword 123456minConn 5maxConn 30globalTable global_tablebranchTable branch_tablelockTable lock_tablequeryLimit 100maxWait 5000}
}建表sql
-- -------------------------------- 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;seata服务搭建-nacos
db存储模式nacos(注册配置中心)部署 步骤5配置Nacos注册中心负责事务参与者(微服务)和TC通信 使用DBNacos的方式部署高可用集群模式 问题seata为何需要注册中心和配置中心 注册中心是事务参与者需要与事务协调者进行通信。配置中心是如果不配置seata会使用默认的配置script/config-center/config.txt文件。使用的配置中心的目的是所有TC都使用nacos配置中心中的配置方便统一管理 将Seata server注册到nacos修改confi目录下的registry.conf配置
registry {# file 、nacos 、eureka、redis、zk、consul、etcd3、sofatype nacosnacos {application seata-serverserverAddr 127.0.0.1:8848group SEATA_GROUPnamespace cluster defaultusername password }
}config {# file、nacos 、apollo、zk、consul、etcd3type nacosnacos {serverAddr 127.0.0.1:8848namespace group SEATA_GROUPusername password }
}将配置注册到nacos修改confi.txt,还需要将config.txt的数据源改为db,然后通过nacos/nacos-config.sh注册到nacos store.db.urljdbc:mysql://192.168.184.1:3306/seata?useUnicodetrue store.db.userroot store.db.password123456
transport.typeTCP
transport.serverNIO
transport.heartbeattrue
transport.enableClientBatchSendRequestfalse
transport.threadFactory.bossThreadPrefixNettyBoss
transport.threadFactory.workerThreadPrefixNettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefixNettyServerBizHandler
transport.threadFactory.shareBossWorkerfalse
transport.threadFactory.clientSelectorThreadPrefixNettyClientSelector
transport.threadFactory.clientSelectorThreadSize1
transport.threadFactory.clientWorkerThreadPrefixNettyClientWorkerThread
transport.threadFactory.bossThreadSize1
transport.threadFactory.workerThreadSizedefault
transport.shutdown.wait3
service.vgroupMapping.my_test_tx_groupdefault
service.default.grouplist127.0.0.1:8091
service.enableDegradefalse
service.disableGlobalTransactionfalse
client.rm.asyncCommitBufferLimit10000
client.rm.lock.retryInterval10
client.rm.lock.retryTimes30
client.rm.lock.retryPolicyBranchRollbackOnConflicttrue
client.rm.reportRetryCount5
client.rm.tableMetaCheckEnablefalse
client.rm.sqlParserTypedruid
client.rm.reportSuccessEnablefalse
client.rm.sagaBranchRegisterEnablefalse
client.tm.commitRetryCount5
client.tm.rollbackRetryCount5
client.tm.defaultGlobalTransactionTimeout60000
client.tm.degradeCheckfalse
client.tm.degradeCheckAllowTimes10
client.tm.degradeCheckPeriod2000
store.modedb
store.db.datasourcedruid
store.db.dbTypemysql
store.db.driverClassNamecom.mysql.jdbc.Driver
store.db.urljdbc:mysql://192.168.184.1:3306/seata?useUnicodetrue
store.db.userroot
store.db.password123456
store.db.minConn5
store.db.maxConn30
store.db.globalTableglobal_table
store.db.branchTablebranch_table
store.db.queryLimit100
store.db.lockTablelock_table
store.db.maxWait5000
store.redis.host127.0.0.1
store.redis.port6379
store.redis.maxConn10
store.redis.minConn1
store.redis.database0
store.redis.passwordnull
store.redis.queryLimit100
server.recovery.committingRetryPeriod1000
server.recovery.asynCommittingRetryPeriod1000
server.recovery.rollbackingRetryPeriod1000
server.recovery.timeoutRetryPeriod1000
server.maxCommitRetryTimeout-1
server.maxRollbackRetryTimeout-1
server.rollbackRetryTimeoutUnlockEnablefalse
client.undo.dataValidationtrue
client.undo.logSerializationjackson
client.undo.onlyCareUpdateColumnstrue
server.undo.logSaveDays7
server.undo.logDeletePeriod86400000
client.undo.logTableundo_log
client.log.exceptionRate100
transport.serializationseata
transport.compressornone
metrics.enabledfalse
metrics.registryTypecompact
metrics.exporterListprometheus
metrics.exporterPrometheusPort9898注册配置到nacos 打开\script\config-center\nacos运行nacos-config.sh linux端运行如果是本地sh nacos-config.sh如果nacos在远程sh nacos-config.sh -h 192.168.184.15 -p 8848 执行后 可以看到配置已经注册到了nacos
启动seata服务 sh seata-server.sh -h 192.168.184.15 -p 8091运行seata服务sh seata-server.sh -h 192.168.184.15 -p 8091默认端口号8091 此时可以看到seata服务已经注册到了nacos
分布式事务代码搭建-client端搭建 声明式事务实现GlobalTransactional 接入微服务应用
业务场景 用户下单整个业务逻辑由三个微服务构成
订单服务根据采购需求创建订单。库存服务对给定的商品扣除库存数量 启动seata server端seata server使用nacos作为配置中心和注册中心(上一步已完成) 配置微服务整合seata前置工作新建两个数据库用来测试 在两个库创建两个表
DROP TABLE IF EXISTS order_tbl;
CREATE TABLE order_tbl (id int NOT NULL AUTO_INCREMENT,product_id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,total_amount int NULL DEFAULT NULL,status varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (id) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT Dynamic;SET FOREIGN_KEY_CHECKS 1;DROP TABLE IF EXISTS stock_tpl;
CREATE TABLE stock_tpl (id int NOT NULL AUTO_INCREMENT,product_id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,count int NULL DEFAULT NULL,PRIMARY KEY (id) USING BTREE
) ENGINE InnoDB CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ROW_FORMAT Dynamic;SET FOREIGN_KEY_CHECKS 1;测试项目架构图 具体项目见码云 https://gitee.com/www_zzq_com/springcloud-alibaba_study第一步添加pom依赖 !--添加seata依赖--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependency第二步各微服务对应的数据库中添加undo_log表 undo_log表作用回滚数据使用
CREATE TABLE IF NOT EXISTS undo_log
(branch_id BIGINT(20) NOT NULL COMMENT branch transaction id,xid VARCHAR(100) 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;第三步配置事务的组 config.txt中配置的分组和客户端必须一一对应
server:port: 8083
spring:application:name: order-seata-servicecloud:nacos:server-addr: 192.168.184.15:8848username: nacospassword: nacosdiscovery:namespace: publicalibaba:seata:tx-service-group: shanghai #配置事务分组第四步 配置文件中进行配置与seata服务进行交互
#seata配置
seata:#seata注册中心registry:#配置seata的注册中心告诉seata client怎么去访问seata servertype: nacosnacos:server-addr: 192.168.184.15:8848 #seata server所在的nacos服务地址application: seata-server #seata server的服务名username: nacospassword: nacos#seata配置中心config:type: nacosnacos:server-addr: 192.168.184.15:8848 #seata server所在的nacos服务地址username: nacospassword: nacos第五步使用在业务方法上添加GlobalTransactional注解 GlobalTransactionalpublic OrderTbl create(OrderTbl orderTbl) {//插入能否成功orderMapper.insertOrder(orderTbl);//扣减库存,能否成功String s stockService.detectStock(orderTbl.getProductId());int a1/0;return orderTbl;}