springboot + springcloud alibaba seata如何设置分布式事务模式
时间: 2023-11-18 21:06:16 浏览: 214
Spring Cloud Alibaba Seata实现分布式事务
使用 Spring Boot 和 Spring Cloud Alibaba Seata 实现分布式事务需要以下步骤:
1. 添加依赖:在 pom.xml 中添加 seata-all 和 seata-spring-boot-starter 依赖。
2. 配置 Seata:在 application.properties 或 application.yml 中配置 Seata Server 的地址和端口,以及各个事务组的配置信息。
3. 配置数据源代理:使用 Seata 提供的数据源代理,将原本的数据源替换为 Seata 提供的代理数据源。
4. 配置分布式事务注解:在需要进行分布式事务的方法上添加 @GlobalTransactional 注解。
下面是一个示例 application.yml 配置文件:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
seata:
enabled: true
application-id: demo-app
tx-service-group: my_tx_group
config:
type: nacos
nacos:
serverAddr: localhost:8848
namespace: public
service:
vgroupMapping:
my_test_tx_group: default
groupMapping:
my_test_tx_group: "DEMO_GROUP"
datasources:
ds:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
maxPoolSize: 20
minPoolSize: 1
initialSize: 1
maxLifetime: 1800000
validationQuery: select 1
validationQueryTimeout: 30000
testOnBorrow: true
testWhileIdle: true
testOnReturn: false
```
在代码中使用 @GlobalTransactional 注解:
```java
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private AccountClient accountClient;
@Autowired
private StorageClient storageClient;
@GlobalTransactional
@Override
public void create(Order order) {
// 1. 创建订单
orderMapper.create(order);
// 2. 扣减库存
storageClient.deduct(order.getProductId(), order.getCount());
// 3. 扣减账户余额
accountClient.deduct(order.getUserId(), order.getMoney());
// 4. 修改订单状态
orderMapper.update(order.getUserId(), 0);
}
}
```
其中,AccountClient 和 StorageClient 是通过 Feign 实现的远程调用,这些服务也需要添加 Seata 的依赖和配置。
这样就可以实现分布式事务了。
阅读全文