大庆网站建设黑icp备1900,怎么在网页中加入图片,中国工厂网站官方网站,公司做自己的网站平台台目录
一、分布式事务基础
#xff08;一#xff09;事务
#xff08;二#xff09;本地事务
#xff08;三#xff09;分布式事务
二、Seata概述
1.Seata 的架构包含:
2.其工作原理为:
3.如果需要在 Spring Boot 应用中使用 Seata 进行分布式事务管理,主要步骤为…目录
一、分布式事务基础
一事务
二本地事务
三分布式事务
二、Seata概述
1.Seata 的架构包含:
2.其工作原理为:
3.如果需要在 Spring Boot 应用中使用 Seata 进行分布式事务管理,主要步骤为:
1、下载seata并解压
2、修改配置文件
3、创建数据库
4、初始化seata在nacos的配置
5、启动seata服务
6、Seata实现分布式事务控制案例 官网https://seata.io/
一、分布式事务基础
一事务
事务指的就是一个操作单元在这个操作单元中的所有操作最终要保持一致的行为要么所有操作都成功要么所有的操作都被撤销。简单地说事务提供一种“要么什么都不做要么做全套”机制。
二本地事务
本地事物其实可以认为是数据库提供的事务机制。说到数据库事务就不得不说数据库事务中的四大特性: A原子性(Atomicity)一个事务中的所有操作要么全部完成要么全部不完成 C一致性(Consistency)在一个事务执行之前和执行之后数据库都必须处于一致性状态 I隔离性(Isolation)在并发环境中当不同的事务同时操作相同的数据时事务之间互不影响 D持久性(Durability)指的是只要事务成功结束它对数据库所做的更新就必须永久的保存下来 数据库事务在实现时会将一次事务涉及的所有操作全部纳入到一个不可分割的执行单元该执行单元中 的所有操作要么都成功要么都失败只要其中任一操作执行失败都将导致整个事务的回滚
三分布式事务
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 简单的说就是一次大的操作由不同的小操作组成这些小的操作分布在不同的服务器上且属于不同的应用分布式事务需要保证这些小操作要么全部成功要么全部失败。 本质上来说分布式事务就是为了保证不同数据库的数据一致性。
二、Seata概述
Seata官方文档
Seata 是一款开源的分布式事务解决方案,它支持 AT、TCC、SAGA 等事务模式。在微服务架构下提供了分布式事务服务,解决了强一致性的业务处理问题。
1.Seata 的架构包含: TC(Transaction Coordinator):事务协调器,维护全局和分支事务的状态,驱动全局事务提交或回滚。 TM(Transaction Manager):控制分支事务,与 TC 交互以控制分支事务的提交、回滚等。 RM(Resource Manager):控制分支事务涉及的资源,与 TM 交互以控制分支事务。
2.其工作原理为: 应用开始全局事务,通过调用 TC 的 begin() 方法开启一个全局事务。 应用调用多个 TM 的 begin() 方法开启分支事务。TC 统一控制这些分支事务。 分支事务可以操作多个 RM 的资源,RM 参与者需要实现回滚和提交方法。 当应用结束分支事务并决定提交或回滚全局事务时,它会通知 TC。TC 将指示所有的 TM 提交或回滚相应的分支事务。 TM 将指示 RM 执行实际的提交或回滚操作。 操作完成后,TC、TM 和 RM 会相互确认这些操作,以确保全局事务的最终一致性。
3.如果需要在 Spring Boot 应用中使用 Seata 进行分布式事务管理,主要步骤为:
1、下载seata并解压
1下载
下载地址Release v1.5.2 · seata/seata · GitHub
下载的版本参考springcloudalibaba-seata版本参考 2解压 2、修改配置文件
seata/conf/application.yml 进行修改 参考官网配置[seata/script at master · seata/seata · GitHub]
修改 seata\conf\application.yml 的内容主要有以下三部分 application.yml
server:port: 7091spring:application:name: seata-serverlogging:config: classpath:logback-spring.xmlfile:path: ${user.home}/logs/seataextend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstashconsole:user:username: seatapassword: seata seata:config:# support: nacos 、 consul 、 apollo 、 zk 、 etcd3type: nacosnacos:server-addr: 127.0.0.1:8848namespace:group: SEATA_GROUPusername:password:##if use MSE Nacos with auth, mutex with username/password attribute#access-key: #secret-key: data-id: seataServer.propertiesregistry:# support: nacos 、 eureka 、 redis 、 zk 、 consul 、 etcd3 、 sofatype: nacos#preferred-networks: 30.240.*nacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPnamespace:cluster: defaultusername:password:##if use MSE Nacos with auth, mutex with username/password attribute#access-key: #secret-key: server:service-port: 8091 #If not configured, the default is ${server.port} 1000max-commit-retry-timeout: -1max-rollback-retry-timeout: -1rollback-retry-timeout-unlock-enable: falseenable-check-auth: trueenable-parallel-request-handle: trueretry-dead-threshold: 130000xaer-nota-retry-timeout: 60000recovery:handle-all-session-period: 1000undo:log-save-days: 7log-delete-period: 86400000session:branch-async-queue-size: 5000 #branch async remove queue sizeenable-branch-async-remove: false #enable to asynchronous remove branchSessionstore:# support: file 、 db 、 redismode: db#session:# mode: file#lock:# mode: filedb:datasource: druiddb-type: mysqldriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatementstrueuser: rootpassword: 123456min-conn: 5max-conn: 100global-table: global_tablebranch-table: branch_tablelock-table: lock_tabledistributed-lock-table: distributed_lockquery-limit: 100max-wait: 5000metrics:enabled: falseregistry-type: compactexporter-list: prometheusexporter-prometheus-port: 9898transport:rpc-tc-request-timeout: 30000enable-tc-server-batch-send-response: falseshutdown:wait: 3thread-factory:boss-thread-prefix: NettyBossworker-thread-prefix: NettyServerNIOWorkerboss-thread-size: 1security:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login 3、创建数据库
创建上面配置中的 seata 数据库并根据解压路径 seata\script\server\db\mysql.sql 文件创建表
4、初始化seata在nacos的配置
1进入到上面下载好的seata的解压后的seata\script\config-center\nacos目录中
执行nacos-config.sh文件进入当前层级的cmd执行下面带参数的命令
就会将seata\script\config-center\config.txt文件中的配置全部写入到127.0.0.1:8848的nacos配置中心中。
启动参数说明如下 执行成功后可以打开Nacos的控制台在配置列表中可以看到初始化了很多Group为SEATA_GROUP的配置。
2适当将seata\script\config-center\config.txt文件的默认配置删掉再去执行nacos-config.sh文件否则配置中心的配置太多了我自己的最终config.txt文件如下
#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.typeTCP
transport.serverNIO
transport.heartbeattrue
transport.enableTmClientBatchSendRequestfalse
transport.enableRmClientBatchSendRequesttrue
transport.enableTcServerBatchSendResponsefalse
transport.rpcRmRequestTimeout30000
transport.rpcTmRequestTimeout30000
transport.rpcTcRequestTimeout30000
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
transport.serializationseata
transport.compressornone#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_groupdefault
#If you use a registry, you can ignore it
service.default.grouplist127.0.0.1:8091
service.enableDegradefalse
service.disableGlobalTransactionfalse#Transaction rule configuration, only for the client#For TCC transaction mode
tcc.fence.logTableNametcc_fence_log
tcc.fence.cleanPeriod1h#Log rule configuration, for client and server
log.exceptionRate100
5、启动seata服务
两种启动方式 windows中双击seata\bin\seata-server.bat启动 使用命令启动如下 cd bin
seata-server.bat -p 9000 -m file
启动后在 Nacos 的服务列表下面可以看到一个名为 serverAddr 的服务。 6、Seata实现分布式事务控制案例
案例解析一个user模块一个product模块测试user通过feign调用product中的方法
第一步在各个微服务中添加seata依赖
!--seata依赖--
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId
/dependency
第二步在各个微服务连接的数据库中添加undo_log表
CREATE TABLE undo_log
(
id BIGiNT(20) NOT NULL AUTO_INCREMENT,
branch_id BIGiNT(20) NOT NULL,
xid VARcHAR(100) NOT NULL,
context VARcHAR(128) NOT NULL,
rollback_info LONGBLOB NOT NULL,
log_status iNT(11) NOT NULL,
log_created DATETIME NOT NULL,
log_modified DATETIME NOT NULL,
ext VARcHAR(100) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE INNODB
AUTO_INCREMENT 1
DEFAULT CHARSET utf8;
第三步配置配置事务分组配置seata注册中心和配置中心
spring:application:name: product-serverdatasource:url: jdbc:mysql://localhost:3306/product?useSSLfalseuseUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: 123456cloud:nacos:discovery:server-addr: 127.0.0.1:8848# 以下的是每个微服务都要添加的配置alibaba:seata:tx-service-group: default_tx_group
# 配置seata注册中心和配置中心
seata:registry:type: nacosnacos:application: seata-serverserver-addr: 127.0.0.1:8848group: SEATA_GROUPconfig:type: nacosnacos:server-addr: 127.0.0.1:8848group: SEATA_GROUP
第四步在被调用微服务里编写方法
RestController
RequestMapping(/product)
public class ProductController {Autowiredprivate ProductMapper productMapper;PostMapping(/get1)public Integer update(RequestBody Product product){int i productMapper.updateNumByPId(product);return i;}
}
第五步在调用者微服务里写feign接口调用其他微服务的方法
FeignClient(value product-server, path /product)
public interface ProductFeign {PostMapping(/get1)void updateNumByPId(RequestBody Product product);
}
第六步在调用者微服务的serviceImpl编写方法在方法上加 GlobalTransactional 注解 开启事务
Service
public class UserServiceImpl extends ServiceImplUserMapper, Userimplements UserService{
Autowiredprivate UserMapper userMapper;Autowiredprivate ProductFeign productFeign;
OverrideGlobalTransactionalpublic void updateNumByPId(RequestBody User user) {Product product new Product();product.setPid(1);product.setNum(2000);productFeign.updateNumByPId(product);int a 1 / 0;userMapper.updateById(user);}
}
第七步controller测试service层的除零那行打断点Debug测试
RestController
RefreshScope // 在需要动态读取配置的类上添加此注解就可以动态配置刷新
RequestMapping(/user)
public class UserController {
Autowiredprivate UserService userService;// Seata实现分布式事务控制PostMapping(/testSeata)public void testSeata(RequestBody User user){userService.updateNumByPId(user);}
}
结果在没有出现除0异常的时候数据被正常修改出现异常后不会继续往下执行而是将上面的操作进行回滚。