微服务间调用如何保证事务
1.下载安装包
https://github.com/seata/seata/releases/tag/v1.4.2
windows 选 seata-server-1.4.2.zip
2.解压,编辑 X:\seata\seata\seata-server-1.4.2\conf\registry.conf.conf 文件
注册中心是啥 type 就写啥
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/de00413c4812c5261e4e38c24c93072d.png)
3.编辑 X:\seata\seata\seata-server-1.4.2\conf\file.conf 文件
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/84b4817619d35a5571722fc8c5df9f2a.png)
启动: bin/seata-server.bat
打开eureka,发现已经注册上去了
4.不同的服务对应的库都加上这3个表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for global_table
-- ----------------------------
#全局事务表
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table` (
`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`transaction_id` bigint(20) NULL DEFAULT NULL,
`status` tinyint(4) NOT NULL,
`application_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`transaction_service_group` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`transaction_name` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`timeout` int(11) NULL DEFAULT NULL,
`begin_time` bigint(20) NULL DEFAULT NULL,
`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`gmt_create` datetime(0) NULL DEFAULT NULL,
`gmt_modified` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`xid`) USING BTREE,
INDEX `idx_gmt_modified_status`(`gmt_modified`, `status`) USING BTREE,
INDEX `idx_transaction_id`(`transaction_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
#分支事务表
DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table` (
`branch_id` bigint(20) NOT NULL,
`xid` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`transaction_id` bigint(20) NULL DEFAULT NULL,
`resource_group_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`branch_type` varchar(8) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`status` tinyint(4) NULL DEFAULT NULL,
`client_id` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`application_data` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`gmt_create` datetime(6) NULL DEFAULT NULL,
`gmt_modified` datetime(6) NULL DEFAULT NULL,
PRIMARY KEY (`branch_id`) USING BTREE,
INDEX `idx_xid`(`xid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
#锁表
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table` (
`row_key` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`xid` varchar(96) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`transaction_id` bigint(20) NULL DEFAULT NULL,
`branch_id` bigint(20) NOT NULL,
`resource_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`table_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`pk` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`gmt_create` datetime(0) NULL DEFAULT NULL,
`gmt_modified` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`row_key`) USING BTREE,
INDEX `idx_branch_id`(`branch_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
5.服务调用者 和 被调用者 pom 加上
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2021.1</version>
</dependency>
6. 同样调用和被调用都加上yml
seata:
enabled: true
application-id: ${spring.application.name}
tx-service-group: seata-server
enable-auto-data-source-proxy: true
service:
default: 127.0.0.1:8091
vgroup-mapping:
seata-server: default
config:
type: file
file:
name: file.conf
registry:
type: file
file:
name: file
7.在service 加上
@GlobalTransactional(name = "seata-server", rollbackFor = Exception.class)
即可实现分布式事务!!!
8.代码展示
服务提供者Order
@RestController
@RequestMapping("/product")
public class ProductController {
@Resource
private OrderService orderService;
@PostMapping("/addOrder" )
public void addOrder(@RequestBody Order order){
orderService.addOrder(order);
}
}
消费者服务Rpc===========》
@Component
@FeignClient(value = "ORDER-PRODUCT")
public interface OrderFeign {
@RequestMapping(value ="/product/addOrder", method = RequestMethod.POST)
public void addOrder(@RequestBody Order order);
}
消费者服务Controller===========》
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/addOrder" )
public void addOrder(@RequestBody Order order){
userService.addUser(new User().setUserName("阿毛"),order);
}
}
消费者服务service===========》
public interface UserService extends IService<User> {
void addUser(User user, Order order);
}
消费者服务serviceImpl===========》
@Service
@GlobalTransactional(name = "seata-server", rollbackFor = Exception.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Resource
private OrderFeign orderFeign;
@Override
@Transactional(rollbackFor = Exception.class)
public void addUser(User user, Order order) {
orderFeign.addOrder(order);
if(true){
throw new RuntimeException("报错了!");
}
baseMapper.insert(user);
}
}