Seata实现分布式事务控制
目录
1. 启动Seata
1.1 下载seata
下载地址:https://github.com/seata/seata/releases/v1.3.0/
1.2 修改配置文件及初始化
将下载得到的seata(非源码包)压缩包进行解压,进入conf目录
修改file.conf (非源码包)
创建数据库Seata并初始化数据表 (源码包)
解压seata-1.4.0源码包,并进入到seata-1.4.0\script\server\db目录,复制运行mysql.sql脚本完成seata服务端数据库初始化工作。
修改registry.conf(非源码包)
将下载得到的seata(非源码包)压缩包进行解压,进入conf目录
修改seata-1.4.0(源码包)中script/config-center目录中的config.txt配置:
初始化Seata配置到Nacos中 (非源码包)
在seata-1.4.0\script\config-center\nacos目录中右键选择git bash here,运行git命令窗口。并输入以下命令:sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -u nacos -w nacos
执行成功后可以打开Nacos的控制台,在配置列表中,可以看到初始化了很多Group为SEATA_GROUP 的配置。
启动seata服务(非源码包)
直接进入seata服务的seata\bin目录下,双击运行seata-server.bat文件即可。或者使用以下命令方式运行:
cd bin
seata-server.bat -p 9000 -m file
seata-server.bat -h ip地址 -p 9000 -m file
2. 使用Seata实现事务控制
2.1 初始化数据表
进入源码包seata-1.4.0\script\client\at\db目录,复制并运行mysql.sql数据库脚本完成undo_log表创建,这是Seata记录事务日志要用到的表。
-
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;
2.2 添加配置
- 添加依赖
在zmall-order和zmall-product模块中分别引入以下依赖:
-
<dependency>
-
<groupId>com.alibaba.cloud</groupId>
-
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
-
</dependency>
-
<!-- 如果已经添加了nacos配置中心依赖,则可以不加入 -->
-
<dependency>
-
<groupId>com.alibaba.cloud</groupId>
-
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-
</dependency>
- DataSourceProxyConfig
Seata 是通过代理数据源实现事务分支的,所以需要配置io.seata.rm.datasource.DataSourceProxy 的Bean,且是 @Primary默认的数据源,否则事务不会回滚,无法实现分布式事务。请在zmall-order中添加DruidDataSource配置类,具体如下所示:
-
package com.zking.zmall.config;
-
-
import com.alibaba.druid.pool.DruidDataSource;
-
import io.seata.rm.datasource.DataSourceProxy;
-
import io.seata.rm.datasource.xa.DataSourceProxyXA;
-
import org.springframework.boot.context.properties.ConfigurationProperties;
-
import org.springframework.context.annotation.Bean;
-
import org.springframework.context.annotation.Configuration;
-
import org.springframework.context.annotation.Primary;
-
-
import javax.sql.DataSource;
-
-
-
public class DataSourceProxyConfig {
-
-
-
public DruidDataSource druidDataSource() {
-
return new DruidDataSource();
-
}
-
-
-
-
public DataSource dataSource(DruidDataSource druidDataSource) {
-
//AT模式
-
return new DataSourceProxy(druidDataSource);
-
//XA模式
-
//return new DataSourceProxyXA(druidDataSource);
-
}
-
}
- 在启动类上排除DataSource数据源自动配置类
-
-
-
-
-
public class ZmallOrderApplication {
-
-
public static void main(String[] args) {
-
SpringApplication.run(ZmallOrderApplication.class, args);
-
}
-
}
在需要进行分布式事务的微服务中进行下面几项配置:
- application.yml
-
spring:
-
datasource:
-
#type连接池类型 DBCP,C3P0,Hikari,Druid,默认为Hikari
-
type: com.alibaba.druid.pool.DruidDataSource
-
driver-class-name: com.mysql.jdbc.Driver
-
url: jdbc:mysql://localhost:3306/zmall?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
-
username: root
-
password: 1234
-
-
- registry.conf
在微服务模块中的resources目录下添加seata的配置文件 registry.conf,该配置文件来自于seata-server/conf目录下的配置文件。
-
registry {
-
type = "nacos"
-
nacos {
-
serverAddr = "localhost"
-
namespace = "public"
-
cluster = "default"
-
}
-
}
-
config {
-
type = "nacos"
-
nacos {
-
serverAddr = "localhost"
-
namespace = "public"
-
cluster = "default"
-
}
-
}
- bootstrap.yaml
-
spring:
-
application:
-
name: service-product
-
cloud:
-
nacos:
-
config:
-
server-addr: localhost:8848 # nacos的服务端地址
-
namespace: public
-
group: SEATA_GROUP
-
alibaba:
-
seata:
-
tx-service-group: my_test_tx_group
- 在order微服务开启全局事务
-
//seata全局事务控制
-
-
-
public Order createOrder(Integer pid, Integer num) {
-
//根据商品ID修改商品对应的库存
-
productService.updateStock(pid,num);
-
//模拟程序执行报错
-
int i=1 / 0;
-
//新增订单
-
Order order=new Order();
-
//此处只是做模拟操作
-
this.save(order);
-
return order;
-
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfhghe
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01