目录
概述
seata 1.8.0 版本,针对 spring cloud alibaba feign 应用。
实践
seata-server 所需表
建 ry-seata 库,以下四张表
-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`status` TINYINT NOT NULL,
`application_id` VARCHAR(32),
`transaction_service_group` VARCHAR(32),
`transaction_name` VARCHAR(128),
`timeout` INT,
`begin_time` BIGINT,
`application_data` VARCHAR(2000),
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`xid`),
KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
`branch_id` BIGINT NOT NULL,
`xid` VARCHAR(128) NOT NULL,
`transaction_id` BIGINT,
`resource_group_id` VARCHAR(32),
`resource_id` VARCHAR(256),
`branch_type` VARCHAR(8),
`status` TINYINT,
`client_id` VARCHAR(64),
`application_data` VARCHAR(2000),
`gmt_create` DATETIME(6),
`gmt_modified` DATETIME(6),
PRIMARY KEY (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
`row_key` VARCHAR(128) NOT NULL,
`xid` VARCHAR(128),
`transaction_id` BIGINT,
`branch_id` BIGINT NOT NULL,
`resource_id` VARCHAR(256),
`table_name` VARCHAR(32),
`pk` VARCHAR(36),
`status` TINYINT NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
`gmt_create` DATETIME,
`gmt_modified` DATETIME,
PRIMARY KEY (`row_key`),
KEY `idx_status` (`status`),
KEY `idx_branch_id` (`branch_id`),
KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
CREATE TABLE IF NOT EXISTS `distributed_lock`
(
`lock_key` CHAR(20) NOT NULL,
`lock_value` VARCHAR(20) NOT NULL,
`expire` BIGINT,
primary key (`lock_key`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);
seata-server 修改配置
server:
port: 7091
spring:
application:
name: seata-server
datasource:
dynamic:
# 开启seata代理
seata: true
logging:
config: classpath:logback-spring.xml
file:
path: ${log.home:${user.home}/logs/seata}
console:
user:
username: seata
password: seata
seata:
enabled: true
config:
type: nacos
nacos:
server-addr: 10.32.36.131:8848
group: SEATA_GROUP
namespace:
dataId: seataServer.properties
username: nacos
password: nacos
registry:
type: nacos
nacos:
application: seata-server
server-addr: 10.32.36.131:8848
group : SEATA_GROUP
namespace:
username: nacos
password: nacos
# 关闭自动代理
enable-auto-data-source-proxy: false
# Seata 事务组编号,用于 TC 集群名
tx-service-group: ruoyi-system-group
# 服务配置项
service:
# 虚拟组和分组的映射
vgroup-mapping:
ruoyi-system-group: default
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP
sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -t 0af6e9(命名空间) -u nacos -w nacos
seata原理
关键地方如下
seata:
enabled: true
tx-service-group: ruoyi-system-group #要与配置文件中的vgroupMapping一致
service:
vgroup-mapping:
ruoyi-system-group: default
# 原理关键源码打断点 io.seata.discovery.registry.RegistryService#getServiceGroup、io.seata.spring.boot.autoconfigure.SeataCoreAutoConfiguration
问题
sh seata-server.sh -h 10.32.36.131
项目
项目结构如下
表构建
建表 SQL 如下
# 订单数据库信息 seata_order
DROP DATABASE IF EXISTS seata_order;
CREATE DATABASE seata_order;
DROP TABLE IF EXISTS seata_order.p_order;
CREATE TABLE seata_order.p_order
(
id INT(11) NOT NULL AUTO_INCREMENT,
user_id INT(11) DEFAULT NULL,
product_id INT(11) DEFAULT NULL,
amount INT(11) DEFAULT NULL,
total_price DOUBLE DEFAULT NULL,
status VARCHAR(100) DEFAULT NULL,
add_time DATETIME DEFAULT CURRENT_TIMESTAMP,
last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4;
DROP TABLE IF EXISTS seata_order.undo_log;
CREATE TABLE seata_order.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,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4;
# 产品数据库信息 seata_product
DROP DATABASE IF EXISTS seata_product;
CREATE DATABASE seata_product;
DROP TABLE IF EXISTS seata_product.product;
CREATE TABLE seata_product.product
(
id INT(11) NOT NULL AUTO_INCREMENT,
price DOUBLE DEFAULT NULL,
stock INT(11) DEFAULT NULL,
last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4;
DROP TABLE IF EXISTS seata_product.undo_log;
CREATE TABLE seata_product.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,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4;
INSERT INTO seata_product.product (id, price, stock)
VALUES (1, 10, 20);
# 账户数据库信息 seata_account
DROP DATABASE IF EXISTS seata_account;
CREATE DATABASE seata_account;
DROP TABLE IF EXISTS seata_account.account;
CREATE TABLE seata_account.account
(
id INT(11) NOT NULL AUTO_INCREMENT,
balance DOUBLE DEFAULT NULL,
last_update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4;
DROP TABLE IF EXISTS seata_account.undo_log;
CREATE TABLE seata_account.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,
PRIMARY KEY (id),
UNIQUE KEY ux_undo_log (xid, branch_id)
) ENGINE = InnoDB
AUTO_INCREMENT = 1
DEFAULT CHARSET = utf8mb4;
INSERT INTO seata_account.account (id, balance)
VALUES (1, 50);
seata 配置
# seata配置
# 分布式事务配置
seata:
enabled: true
enable-auto-data-source-proxy: true #是否开启数据源自动代理,默认为true
tx-service-group: ruoyi-system-group #要与配置文件中的vgroupMapping一致
registry:
type: nacos
nacos:
application: seata-server
group: SEATA_GROUP
username: nacos
password: nacos
cluster: default
server-addr: 10.32.36.131:8848
service:
vgroup-mapping:
ruoyi-system-group: default
正常下单
http://localhost:10002/order/placeOrder
{
"userId": 1,
"productId": 1,
"amount": 1
}
order日志
2024-03-12T19:14:31.064 [http-nio-10002-exec-2] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-03-12T19:14:31.463 [http-nio-10002-exec-2] INFO i.s.t.TransactionManagerHolder - [<clinit>,40] - TransactionManager Singleton io.seata.tm.DefaultTransactionManager@1cf6c2c9
2024-03-12T19:14:31.478 [http-nio-10002-exec-2] INFO i.s.t.a.DefaultGlobalTransaction - [begin,117] - Begin new global transaction [10.32.36.131:8091:8043927737756327994]
2024-03-12T19:14:31.498 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,40] - com.alibaba.druid.pool.DruidDataSource$$EnhancerBySpringCGLIB$$bce05710
2024-03-12T19:14:31.499 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,41] - =============ORDER START=================
2024-03-12T19:14:31.499 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,45] - 收到下单请求,用户:1, 商品:1,数量:1
2024-03-12T19:14:31.499 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,47] - 当前 XID: 10.32.36.131:8091:8043927737756327994
2024-03-12T19:14:31.893 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,52] - 订单一阶段生成,等待扣库存付款中
2024-03-12T19:14:33.542 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,61] - 订单已成功下单
2024-03-12T19:14:33.542 [http-nio-10002-exec-2] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,62] - =============ORDER END=================
2024-03-12T19:14:33.565 [http-nio-10002-exec-2] INFO i.s.r.AbstractResourceManager - [branchRegister,73] - branch register success, xid:10.32.36.131:8091:8043927737756327994, branchId:8043927737756328002, lockKeys:p_order:1
2024-03-12T19:14:33.626 [http-nio-10002-exec-2] INFO i.s.t.a.DefaultGlobalTransaction - [commit,133] - transaction 10.32.36.131:8091:8043927737756327994 will be commit
2024-03-12T19:14:33.643 [http-nio-10002-exec-2] INFO i.s.t.a.DefaultGlobalTransaction - [suspend,209] - transaction end, xid = 10.32.36.131:8091:8043927737756327994
2024-03-12T19:14:33.643 [http-nio-10002-exec-2] INFO i.s.t.a.DefaultGlobalTransaction - [commit,155] - [10.32.36.131:8091:8043927737756327994] commit status: Committed
2024-03-12T19:14:34.463 [rpcDispatch_RMROLE_1_1_16] INFO i.s.c.r.p.c.RmBranchCommitProcessor - [process,56] - rm client handle branch commit process:BranchCommitRequest{xid='10.32.36.131:8091:8043927737756327994', branchId=8043927737756328002, branchType=AT, resourceId='jdbc:mysql://10.32.36.131:3306/seata_order', applicationData='{"autoCommit":false}'}
2024-03-12T19:14:34.465 [rpcDispatch_RMROLE_1_1_16] INFO i.s.r.AbstractRMHandler - [doBranchCommit,96] - Branch committing: 10.32.36.131:8091:8043927737756327994 8043927737756328002 jdbc:mysql://10.32.36.131:3306/seata_order {"autoCommit":false}
2024-03-12T19:14:34.466 [rpcDispatch_RMROLE_1_1_16] INFO i.s.r.AbstractRMHandler - [doBranchCommit,104] - Branch commit result: PhaseTwo_Committed
product 日志
2024-03-12T19:14:32.066 [http-nio-10003-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-03-12T19:14:32.212 [http-nio-10003-exec-1] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,28] - =============PRODUCT START=================
2024-03-12T19:14:32.212 [http-nio-10003-exec-1] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,29] - 当前 XID: 10.32.36.131:8091:8043927737756327994
2024-03-12T19:14:32.339 [http-nio-10003-exec-1] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,34] - 商品编号为 1 的库存为20,订单商品数量为1
2024-03-12T19:14:32.340 [http-nio-10003-exec-1] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,40] - 开始扣减商品编号为 1 库存,单价商品价格为10.0
2024-03-12T19:14:32.579 [http-nio-10003-exec-1] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,46] - 扣减商品编号为 1 库存成功,扣减后库存为19, 1 件商品总价为 10.0
2024-03-12T19:14:32.579 [http-nio-10003-exec-1] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,47] - =============PRODUCT END=================
2024-03-12T19:14:32.608 [http-nio-10003-exec-1] INFO i.s.r.AbstractResourceManager - [branchRegister,73] - branch register success, xid:10.32.36.131:8091:8043927737756327994, branchId:8043927737756327997, lockKeys:product:1
2024-03-12T19:14:34.425 [rpcDispatch_RMROLE_1_1_16] INFO i.s.c.r.p.c.RmBranchCommitProcessor - [process,56] - rm client handle branch commit process:BranchCommitRequest{xid='10.32.36.131:8091:8043927737756327994', branchId=8043927737756327997, branchType=AT, resourceId='jdbc:mysql://10.32.36.131:3306/seata_product', applicationData='{"autoCommit":false}'}
2024-03-12T19:14:34.427 [rpcDispatch_RMROLE_1_1_16] INFO i.s.r.AbstractRMHandler - [doBranchCommit,96] - Branch committing: 10.32.36.131:8091:8043927737756327994 8043927737756327997 jdbc:mysql://10.32.36.131:3306/seata_product {"autoCommit":false}
2024-03-12T19:14:34.428 [rpcDispatch_RMROLE_1_1_16] INFO i.s.r.AbstractRMHandler - [doBranchCommit,104] - Branch commit result: PhaseTwo_Committed
account 日志
2024-03-12T19:14:32.821 [http-nio-10001-exec-1] INFO o.a.c.c.C.[.[.[/] - [log,173] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-03-12T19:14:32.974 [http-nio-10001-exec-1] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,28] - =============ACCOUNT START=================
2024-03-12T19:14:32.975 [http-nio-10001-exec-1] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,29] - 当前 XID: 10.32.36.131:8091:8043927737756327994
2024-03-12T19:14:33.106 [http-nio-10001-exec-1] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,33] - 下单用户1余额为 50.0,商品总价为10.0
2024-03-12T19:14:33.107 [http-nio-10001-exec-1] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,39] - 开始扣减用户 1 余额
2024-03-12T19:14:33.343 [http-nio-10001-exec-1] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,43] - 扣减用户 1 余额成功,扣减后用户账户余额为40.0
2024-03-12T19:14:33.343 [http-nio-10001-exec-1] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,44] - =============ACCOUNT END=================
2024-03-12T19:14:33.374 [http-nio-10001-exec-1] INFO i.s.r.AbstractResourceManager - [branchRegister,73] - branch register success, xid:10.32.36.131:8091:8043927737756327994, branchId:8043927737756327999, lockKeys:account:1
2024-03-12T19:14:34.443 [rpcDispatch_RMROLE_1_1_16] INFO i.s.c.r.p.c.RmBranchCommitProcessor - [process,56] - rm client handle branch commit process:BranchCommitRequest{xid='10.32.36.131:8091:8043927737756327994', branchId=8043927737756327999, branchType=AT, resourceId='jdbc:mysql://10.32.36.131:3306/seata_account', applicationData='{"autoCommit":false}'}
2024-03-12T19:14:34.445 [rpcDispatch_RMROLE_1_1_16] INFO i.s.r.AbstractRMHandler - [doBranchCommit,96] - Branch committing: 10.32.36.131:8091:8043927737756327994 8043927737756327999 jdbc:mysql://10.32.36.131:3306/seata_account {"autoCommit":false}
2024-03-12T19:14:34.447 [rpcDispatch_RMROLE_1_1_16] INFO i.s.r.AbstractRMHandler - [doBranchCommit,104] - Branch commit result: PhaseTwo_Committed
库存不足
http://localhost:10002/order/placeOrder
{
"userId": 1,
"productId": 1,
"amount": 22
}
2024-03-12T20:17:45.806 [http-nio-10002-exec-3] INFO i.s.t.a.DefaultGlobalTransaction - [begin,117] - Begin new global transaction [10.32.36.131:8091:8043927737756328829]
2024-03-12T20:17:45.813 [http-nio-10002-exec-3] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,40] - com.alibaba.druid.pool.DruidDataSource$$EnhancerBySpringCGLIB$$34891bfd
2024-03-12T20:17:45.813 [http-nio-10002-exec-3] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,41] - =============ORDER START=================
2024-03-12T20:17:45.813 [http-nio-10002-exec-3] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,45] - 收到下单请求,用户:1, 商品:1,数量:22
2024-03-12T20:17:45.813 [http-nio-10002-exec-3] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,47] - 当前 XID: 10.32.36.131:8091:8043927737756328829
2024-03-12T20:17:45.832 [http-nio-10002-exec-3] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,52] - 订单一阶段生成,等待扣库存付款中
2024-03-12T20:17:45.904 [http-nio-10002-exec-3] INFO i.s.t.a.DefaultGlobalTransaction - [rollback,171] - transaction 10.32.36.131:8091:8043927737756328829 will be rollback
2024-03-12T20:17:45.917 [http-nio-10002-exec-3] INFO i.s.t.a.DefaultGlobalTransaction - [suspend,209] - transaction end, xid = 10.32.36.131:8091:8043927737756328829
2024-03-12T20:17:45.917 [http-nio-10002-exec-3] INFO i.s.t.a.DefaultGlobalTransaction - [rollback,193] - [10.32.36.131:8091:8043927737756328829] rollback status: Rollbacked
2024-03-12T20:17:45.918 [http-nio-10002-exec-3] ERROR c.r.c.s.h.GlobalExceptionHandler - [handleRuntimeException,107] - 请求地址'/order/placeOrder',发生未知异常.
feign.FeignException$InternalServerError: [500] during [GET] to [http://product/reduceStock?productId=1&amount=22] [ProductFeign#reduceStock(Long,Integer)]: [{"msg":"库存不足","code":500}]
2024-03-12T20:14:51.553 [http-nio-10003-exec-5] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,28] - =============PRODUCT START=================
2024-03-12T20:14:51.554 [http-nio-10003-exec-5] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,29] - 当前 XID: 10.32.36.131:8091:8043927737756328640
2024-03-12T20:14:51.564 [http-nio-10003-exec-5] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,34] - 商品编号为 1 的库存为19,订单商品数量为6
2024-03-12T20:14:51.564 [http-nio-10003-exec-5] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,40] - 开始扣减商品编号为 1 库存,单价商品价格为10.0
2024-03-12T20:14:51.598 [http-nio-10003-exec-5] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,46] - 扣减商品编号为 1 库存成功,扣减后库存为13, 6 件商品总价为 60.0
2024-03-12T20:14:51.598 [http-nio-10003-exec-5] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,47] - =============PRODUCT END=================
2024-03-12T20:14:51.611 [http-nio-10003-exec-5] INFO i.s.r.AbstractResourceManager - [branchRegister,73] - branch register success, xid:10.32.36.131:8091:8043927737756328640, branchId:8043927737756328642, lockKeys:product:1
2024-03-12T20:14:51.690 [rpcDispatch_RMROLE_1_3_16] INFO i.s.c.r.p.c.RmBranchRollbackProcessor - [process,56] - rm handle branch rollback process:BranchRollbackRequest{xid='10.32.36.131:8091:8043927737756328640', branchId=8043927737756328642, branchType=AT, resourceId='jdbc:mysql://10.32.36.131:3306/seata_product', applicationData='{"autoCommit":false}'}
2024-03-12T20:14:51.690 [rpcDispatch_RMROLE_1_3_16] INFO i.s.r.AbstractRMHandler - [doBranchRollback,123] - Branch Rollbacking: 10.32.36.131:8091:8043927737756328640 8043927737756328642 jdbc:mysql://10.32.36.131:3306/seata_product
2024-03-12T20:14:51.736 [rpcDispatch_RMROLE_1_3_16] INFO i.s.r.d.u.AbstractUndoLogManager - [undo,338] - xid 10.32.36.131:8091:8043927737756328640 branch 8043927737756328642, undo_log deleted with GlobalFinished
2024-03-12T20:14:51.741 [rpcDispatch_RMROLE_1_3_16] INFO i.s.r.d.DataSourceManager - [branchRollback,124] - branch rollback success, xid:10.32.36.131:8091:8043927737756328640, branchId:8043927737756328642
2024-03-12T20:14:51.742 [rpcDispatch_RMROLE_1_3_16] INFO i.s.r.AbstractRMHandler - [doBranchRollback,131] - Branch Rollbacked result: PhaseTwo_Rollbacked
余额不足
http://localhost:10002/order/placeOrder
{
"userId": 1,
"productId": 1,
"amount": 6
}
2024-03-12T20:21:07.975 [http-nio-10002-exec-7] INFO i.s.t.a.DefaultGlobalTransaction - [begin,117] - Begin new global transaction [10.32.36.131:8091:8043927737756329046]
2024-03-12T20:21:07.983 [http-nio-10002-exec-7] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,40] - com.alibaba.druid.pool.DruidDataSource$$EnhancerBySpringCGLIB$$34891bfd
2024-03-12T20:21:07.983 [http-nio-10002-exec-7] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,41] - =============ORDER START=================
2024-03-12T20:21:07.983 [http-nio-10002-exec-7] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,45] - 收到下单请求,用户:1, 商品:1,数量:6
2024-03-12T20:21:07.983 [http-nio-10002-exec-7] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,47] - 当前 XID: 10.32.36.131:8091:8043927737756329046
2024-03-12T20:21:07.995 [http-nio-10002-exec-7] INFO c.r.o.s.i.OrderServiceImpl - [placeOrder,52] - 订单一阶段生成,等待扣库存付款中
2024-03-12T20:21:08.102 [http-nio-10002-exec-7] INFO i.s.t.a.DefaultGlobalTransaction - [rollback,171] - transaction 10.32.36.131:8091:8043927737756329046 will be rollback
2024-03-12T20:21:08.151 [http-nio-10002-exec-7] INFO i.s.t.a.DefaultGlobalTransaction - [suspend,209] - transaction end, xid = 10.32.36.131:8091:8043927737756329046
2024-03-12T20:21:08.151 [http-nio-10002-exec-7] INFO i.s.t.a.DefaultGlobalTransaction - [rollback,193] - [10.32.36.131:8091:8043927737756329046] rollback status: Rollbacked
2024-03-12T20:21:08.152 [http-nio-10002-exec-7] ERROR c.r.c.s.h.GlobalExceptionHandler - [handleRuntimeException,107] - 请求地址'/order/placeOrder',发生未知异常.
feign.FeignException$InternalServerError: [500] during [GET] to [http://account/reduceBalance?userId=1&price=60.0] [AccountFeign#reduceBalance(Long,Double)]: [{"msg":"余额不足","code":500}]
2024-03-12T20:21:08.004 [http-nio-10003-exec-9] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,28] - =============PRODUCT START=================
2024-03-12T20:21:08.005 [http-nio-10003-exec-9] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,29] - 当前 XID: 10.32.36.131:8091:8043927737756329046
2024-03-12T20:21:08.009 [http-nio-10003-exec-9] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,34] - 商品编号为 1 的库存为19,订单商品数量为6
2024-03-12T20:21:08.010 [http-nio-10003-exec-9] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,40] - 开始扣减商品编号为 1 库存,单价商品价格为10.0
2024-03-12T20:21:08.029 [http-nio-10003-exec-9] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,46] - 扣减商品编号为 1 库存成功,扣减后库存为13, 6 件商品总价为 60.0
2024-03-12T20:21:08.029 [http-nio-10003-exec-9] INFO c.r.p.s.i.ProductServiceImpl - [reduceStock,47] - =============PRODUCT END=================
2024-03-12T20:21:08.040 [http-nio-10003-exec-9] INFO i.s.r.AbstractResourceManager - [branchRegister,73] - branch register success, xid:10.32.36.131:8091:8043927737756329046, branchId:8043927737756329048, lockKeys:product:1
2024-03-12T20:21:08.111 [rpcDispatch_RMROLE_1_5_16] INFO i.s.c.r.p.c.RmBranchRollbackProcessor - [process,56] - rm handle branch rollback process:BranchRollbackRequest{xid='10.32.36.131:8091:8043927737756329046', branchId=8043927737756329048, branchType=AT, resourceId='jdbc:mysql://10.32.36.131:3306/seata_product', applicationData='{"autoCommit":false}'}
2024-03-12T20:21:08.111 [rpcDispatch_RMROLE_1_5_16] INFO i.s.r.AbstractRMHandler - [doBranchRollback,123] - Branch Rollbacking: 10.32.36.131:8091:8043927737756329046 8043927737756329048 jdbc:mysql://10.32.36.131:3306/seata_product
2024-03-12T20:21:08.136 [rpcDispatch_RMROLE_1_5_16] INFO i.s.r.d.u.AbstractUndoLogManager - [undo,338] - xid 10.32.36.131:8091:8043927737756329046 branch 8043927737756329048, undo_log deleted with GlobalFinished
2024-03-12T20:21:08.140 [rpcDispatch_RMROLE_1_5_16] INFO i.s.r.d.DataSourceManager - [branchRollback,124] - branch rollback success, xid:10.32.36.131:8091:8043927737756329046, branchId:8043927737756329048
2024-03-12T20:21:08.141 [rpcDispatch_RMROLE_1_5_16] INFO i.s.r.AbstractRMHandler - [doBranchRollback,131] - Branch Rollbacked result: PhaseTwo_Rollbacked
2024-03-12T20:21:08.076 [http-nio-10001-exec-5] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,28] - =============ACCOUNT START=================
2024-03-12T20:21:08.077 [http-nio-10001-exec-5] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,29] - 当前 XID: 10.32.36.131:8091:8043927737756329046
2024-03-12T20:21:08.083 [http-nio-10001-exec-5] INFO c.r.a.s.i.AccountServiceImpl - [reduceBalance,33] - 下单用户1余额为 40.0,商品总价为60.0
2024-03-12T20:21:08.083 [http-nio-10001-exec-5] WARN c.r.a.s.i.AccountServiceImpl - [reduceBalance,36] - 用户 1 余额不足,当前余额:40.0
2024-03-12T20:21:08.093 [http-nio-10001-exec-5] ERROR c.r.c.s.h.GlobalExceptionHandler - [handleRuntimeException,107] - 请求地址'/reduceBalance',发生未知异常.
java.lang.RuntimeException: 余额不足
问题
- feign 熔断降级导致无法 Rollback,解决方案,可以针对是否有事务,写不同的 feign,不做 fallback 配置。
- 全局异常处理,设置 response status 500 ,可以解决。
结束
seata nacos spring cloud 至此结束。