金华建设银行网站,网站备案的幕布是什么意思,程序员接私活平台,建设网站步骤是1、事务
访问并可能更新数据库中数据库中各种数据线的一个程序执行单元
原子性#xff1a;事务是一个不可分割的工作单位#xff0c;一个事务要么都做要么都不做
一致性#xff1a;必须是使数据库从一个一致性到另一个一致性的状态#xff0c;中间状态不能被观察到
隔离…1、事务
访问并可能更新数据库中数据库中各种数据线的一个程序执行单元
原子性事务是一个不可分割的工作单位一个事务要么都做要么都不做
一致性必须是使数据库从一个一致性到另一个一致性的状态中间状态不能被观察到
隔离性一个事务的执行不能被其他事务干扰
持久性一个事务一旦提交对数据库中的数据的改变是永久的 2、本地事务
Transational
大多数场景下我们的应用都只需要操作单一的数据库称为本地事务 3、常见分布式事务解决方案
seata消息队列sagaXA
都是“两阶段(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三个角色TCServer端为单独服务端部署TM和RMClient端由业务系统集成。
1、资源目录
client存放client端sql脚本 (包含 undo_log表) 参数配置config-center各个配置中心参数导入脚本config.txt(包含server和client原名nacos-config.txt)为通用参数文件serverserver端数据库脚本 (包含 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持久化配置.
步骤
在seata官网的下载页面可以查询到对应支持的springboot版本号
这里使用的是springboot2.7.13seata对应版本1.5.2win上配置DBNOCOS
1启动包 下载后解压缩
2修改store.mode
启动包: seata--conf--application.yml修改store.modedb或者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?rewriteBatchedStatementstrue 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_groupdefault 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 -hhost服务端ip地址默认localhost-pportnacos端口号默认值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 --host指定在注册中心注册的IP不指定获取当前的IP外部访问不熟在云环境和容器中的sevrer建议指定-p--port 指定server启动的端口 默认8091-m--storeMode事务日志存储方式支持file\db\redis默认file (Seata-Server 1.3及以上版本支持redis)-n--serverNode只用seata-server的节点ID 默认1-e--seataEnv 指定seata-server运行环境参考 http://seata.io/en-us/docs/ops/multi-configuration-isolation.html 3、Client端
步骤
1建表 2依赖
版本说明https://github.com/alibaba/spring-cloud-alibaba/wiki
官方步骤https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
【注意】网上学习视频很多有些时间很老版本不适用你现在使用的springboot或者cloud主要还是要多看官网的给的案例步骤以及对照版本否则版本之间可能会存在很多报错。
最开始使用的是seata-spring-boot-starter全局事务开启后发现product还是不能回滚跨服务传递XID不同所以没有回滚。看了一部分解决方法都没有解决只有传递XID或者配置拦截感觉不是最好的解决方式。最后参考官网后发现以下就改用了包。
依赖spring-cloud-alibaba-seata内部集成了seata并实现了xid传递 !-- 微服务 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.7.13/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion2021.0.7/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2021.1/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactIdversion2021.0.1.0/versionexclusionsexclusiongroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-ribbon/artifactId/exclusion/exclusions/dependencydependencygroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactIdversion1.4.2/version/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactIdversion2021.0.5.0/versionexclusionsexclusiongroupIdio.seata/groupIdartifactIdseata-spring-boot-starter/artifactId/exclusion/exclusions/dependency!--各个服务上单独添加--dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependency 3配置文件
#以order为例product同理
server.port1224
spring.application.nameorderspring.datasource.typecom.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
spring.datasource.urljdbc:mysql://localhost:3308/seata?useSSLfalseuseUnicodetruecharacterEncodingutf-8
spring.datasource.usernameroot
spring.datasource.passwordrootspring.cloud.nacos.discovery.server-addr127.0.0.1:8848seata.tx-server-gropuporder-seata-service-groupseata.registry.typenacos
seata.registry.nacos.server-addr127.0.0.1:8848
seata.registry.nacos.applicationseata-server
seata.registry.nacos.usernamenacos
seata.registry.nacos.passwordnacos
seata.registry.nacos.groupSEATA_GROUPseata.config.typenacos
seata.config.nacos.server-addr127.0.0.1:8848
seata.config.nacos.usernamenacos
seata.config.nacos.passwordnacos
seata.config.nacos.groupSEATA_GROUPmybatis.mapper-locationsclasspath:mapper/*.xmlmybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl
sql.showSjSqltrue
4代码 //启动类加上远程调用 EnableFeignClients EnableDiscoveryClien