专业的编程技术博客社区

网站首页 > 博客文章 正文

Seata AT 模式实现两个服务间分布式事务

baijin 2024-10-08 00:41:04 博客文章 8 ℃ 0 评论

使用 Seata AT 模式实现两个服务间分布式事务的简单示例。

首先,你需要在两个服务中都引入 Seata 的依赖。在pom.xml中添加:

<dependencies>
    <!-- Seata -->
    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-all</artifactId>
        <version>您的Seata版本</version>
    </dependency>
    <!-- 其他依赖... -->
</dependencies>

然后,你需要在两个服务的应用配置文件中配置 Seata 的相关参数,如事务组的名称、事务服务器的地址等。

在第一个服务中,你可能有这样的业务代码:

@Service
public class OrderService {

    @Autowired
    private OrderDao orderDao;

    @GlobalTransactional
    public void createOrder(String userId, String productId, int amount) {
        // 创建订单
        Order order = new Order();
        order.setUserId(userId);
        order.setProductId(productId);
        order.setAmount(amount);
        orderDao.insertOrder(order);

        // 调用第二个服务,减少库存
        StockClient.reduceStock(productId, amount);
    }
}

在第二个服务中,你可能有这样的业务代码:

@Service
public class StockService {

    @Autowired
    private StockDao stockDao;

    @GlobalTransactional
    public void reduceStock(String productId, int amount) {
        // 减少库存
        stockDao.reduceStock(productId, amount);
    }
}

在两个服务中,你都需要配置 Seata 的数据源代理,以便 Seata 可以控制和协调分布式事务。

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource dataSource(DataSource druidDataSource) {
        // 使用 Seata 的数据源代理
        return new DataSourceProxy(druidDataSource);
    }
}

最后,你需要在两个服务中启动 Seata 的全局事务扫描,以便 Seata 可以拦截带有@GlobalTransactional注解的方法。

@SpringBootApplication
@EnableFeignClients
@MapperScan("com.example.dao")
@GlobalTransactionScanner
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

这样,当OrderService中的createOrder方法被调用时,它会开启一个全局事务。如果在事务过程中任何服务发生了异常,Seata 会协调两个服务的事务进行回滚;如果所有服务都正常执行,Seata 会协调事务进行提交。

请注意,这个示例是一个简化的示例,实际应用中可能需要考虑更多的细节,比如配置事务分组、配置文件、服务间的通信机制等。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表