seata+eureka使用

微服务间调用如何保证事务

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 就写啥

在这里插入图片描述

3.编辑 X:\seata\seata\seata-server-1.4.2\conf\file.conf 文件

在这里插入图片描述

启动: 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===========/**
 * Created with IntelliJ IDEA
 */
@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) {
        //@Transactional(rollbackFor = Exception.class) 因为是调用其他服务的接口,事务在这里就失效了
        orderFeign.addOrder(order);
        if(true){
            throw new RuntimeException("报错了!");
        }
        baseMapper.insert(user);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值