Seata的搭建和使用
一、seata官网下载地址:
- seata官网 : https://seata.io/zh-cn/docs/download/
- 提示:官网下得贼慢。如果你只是想初步学习一下,可以直接下载我上传的Seata1.3版。
二、seata服务端的搭建步骤
1.修改配置文件,路径为:/解包目录/seata/conf/
- 最新版本使用的配置文件和seata1.3版不一样,新版是application.yml,1.3使用的是file.conf和registry.conf。但配置的内容是一样的。
1. file.conf文件,如果使用file模式则可以不改
- 目录内是file.conf.example文件,建议复制一份,然后将后缀 .example去掉就行了。
- file.conf文件中需要该的内容如下:
## transaction log store, only used in server side
store {
## store mode: file、db
mode = "db" // 这里将file改为db
## file store property
file {
## store location dir
dir = "sessionStore"
# branch session size , if exceeded first try compress lockkey, still exceeded throws exceptions
maxBranchSessionSize = 16384
# globe session size , if exceeded throws exceptions
maxGlobalSessionSize = 512
# file buffer size , if exceeded allocate new buffer
fileWriteBufferCacheSize = 16384
# when recover batch read size
sessionReloadReadSize = 100
# async, sync
flushDiskMode = async
}
## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
datasource = "druid"
## mysql/oracle/postgresql/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.jdbc.Driver" // 填写MySQL驱动
url = "jdbc:mysql://127.0.0.1:3306/seata" // 填写数据库地址
user = "mysql" // 填写用户名
password = "mysql" // 填写密码
minConn = 5
maxConn = 30
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
}
}
2. registry.conf文件,如果使用file模式则可以不改
registry {
# file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
type = "nacos" // 将模式修改为nacos 要改动
nacos {
application = "seata-server" // seata服务注册到nacos上的服务名,修改为自己想取的名字
serverAddr = "127.0.0.1:8848" // nacos的地址和端口 如果是本地可以不改
group = "SEATA_GROUP" // 服务的分组,如果不知道怎么办可以不改,用默认的
namespace = "" // 命名空间,默认是在public中
cluster = "default" // 集群,我这是单机,没用。填默认的就行
username = "nacos" // 登录nacos的用户名,一般就是nacos
password = "nacos" // 登录nacos的密码,一般就是nacos
}
... // 省略不需要修改的部分
}
config {
# file、nacos 、apollo、zk、consul、etcd3
type = "nacos" // 将模式修改为nacos 要改动
nacos {
serverAddr = "127.0.0.1:8848" //nacos服务器的IP和端口 如果是本地可以不改
namespace = "" // 命名空间,默认是在public中
group = "SEATA_GROUP" // 配置的分组
username = "nacos" // 登录的用户名
password = "nacos" // 登录的密码
}
... // 省略不需要修改的部分
}
2. 创建数据库,名字取你在file.conf文件中连接的数据库名
- 数据库的建表语句在 /解包目录/script/server/db/mysql.sql。将lock_table、branch_table和global_table的建表语句在对应数据库中执行一遍。
3. 修改配置文件并上传到nacos
-
进入/解包路径/seata/script/config-center/config.txt文件,修改以下内容:
-
开启nacos,注意版本问题,我这使用的是nacos2.2.0
-
进入/解包路径/seata/script/config-center/nacos/
-
运行nacos-config.sh。如果是windows端,可以通过使用git的方式运行.sh文件:
-
在当前文件夹下右键使用git打开(没有git,请先安装:https://git-scm.com/download/win)
-
使用 sh nacos-config.sh运行程序
-
-
上传后的结果为:
4. 进入/解包路径/bin/,点击seata-server.bat启动
三、seata客户端的搭建步骤
1.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<!-- 该依赖是否加入,取决于你使用哪种配置方式。如果是将seata的配置通过nacos获取,则需要该依赖。如果是通过加入file.conf 和 registry.conf文件的方式则不需要 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
2.在数据库中添加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;
3. 加入配置文件或者修改application.properties文件,任选其一即可
-
第一种方式:加入配置文件。注意:服务器端使用application.yml进行配置时,无法使用该方式
1.进入/解包目录/seata/script/client/conf/,将file.conf和registry.conf复制到项目的resource目录下。
2.修改file.conf文件,这里的default_tx_group和default必须与之前在服务器端设置的一样才行。
之前服务器端的配置为:
3. 修改registry.conf文件,修改内容与服务器端相同。
4.在项目resource目录下的application.properties中加上spring.cloud.alibaba.seata.tx-service-group= default_tx_group。
注意:default_tx_group应该与服务器端的file.conf文件中的service.vgroupMapping后面的内容相同。
-
第二种方式:修改项目启动文件application.properties
# 这里的组名lican_tx_group可以随便填,但default得与服务器端的file.conf中的内容相同
seata.service.vgroup-mapping.lican_tx_group = default
# 这里的default_tx_group也得与file.conf中的内容相同
spring.cloud.alibaba.seata.tx-service-group= default_tx_group
seata.config.type=nacos
seata.config.nacos.server-addr= localhost:8848
seata.config.nacos.username=nacos
seata.config.nacos.password=nacos
seata.registry.type=nacos
seata.registry.nacos.server-addr=localhost:8848
seata.registry.nacos.username=nacos
seata.registry.nacos.password=nacos
服务器端的file.conf文件配置:
4. 在你需要远程调用回滚的方法上加上@GlobalTransactional注解
5. 案例
下面方法被调用后新建一个订单,然后远程调用方法更新库存数量(即库存数量减1),最后在int a = 1/0处报错。因主方法上加入了@GlobalTransactional注解,所以应该进行全局回滚。
进行远程调用的方法:
主事务运行结果:
分支事务执行结果:
结果:
该方法使用1/0的方式主动报错进行回滚测试,而且调用的分支事务stock/subject方法执行了,但数据库中的数据并未发生改变。所以回滚成功!
四.总结
此次记录了下seata1.3版的搭建和使用。