SpringCloud(13)
Seata处理分布式事务
问题:(有多个库,如何保持一致,在物理上有多个数据库,但逻辑上保持一个数据库)
单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源。
业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。
Seata组成
- 全局唯一的事务ID
- 三组件TC,TM,RM
TC事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
处理过程
- TM向TC申请开启一个全局事务,全局事务创建成功并性成一个全局唯一的ID;
- XD在微服务调用链路的上下文中传播:
- RM向TC注册分支事务,将其纳入ID对应全局事务的管辖;
- TM向TC发起针对ID的全局提交或回滚决议;
- TC调度XD下管辖的全部分支事务完成提交或回滚请求。
下载配置
(只限于0.9版本以前)
下载完成后,先备份file.conf
然后再修改该文件 主要修改:自定义事务组名称+事务日志存储模块为db+数据库连接信息
- service模块:
1
2
3
4
5service {
#vgroup->rgroup
vgroup_mapping.my_test_tx_group = "springcloud"
···
} - store模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38store {
## store mode: file、db
mode = "db"
## file store
file {
dir = "sessionStore"
# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
max-branch-session-size = 16384
# globe session size , if exceeded throws exceptions
max-global-session-size = 512
# file buffer size , if exceeded allocate new buffer
file-write-buffer-cache-size = 16384
# when recover batch read size
session.reload.read_size = 100
# async, sync
flush-disk-mode = async
}
## database store
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
datasource = "dbcp"
## mysql/oracle/h2/oceanbase etc.
db-type = "mysql"
driver-class-name = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata"
user = "root"
password = "123456"
min-conn = 1
max-conn = 3
global.table = "global_table"
branch.table = "branch_table"
lock-table = "lock_table"
query-limit = 100
}
} - 根据conf给你提供的sql建立一个sql数据库
- 修改register.conf
1
2
3
4
5
6
7
8
9registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos"
nacos {
serverAddr = "localhost:8848"
namespace = ""
cluster = "default"
}
业务准备
详细的可以查看脑图文件,见springcloud学习尚硅谷
每个库都执行建立一个回滚表
![图片上传失败(0)]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小贺同学的blog!
评论