搭建事务协调者tx-Manager
创建tx-manager工程,并引入lcn的依赖
<dependencies>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tm</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
创建application.properties空文件和application.yml文件
server:
port: 50000
spring:
datasource:
username: root
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///tx-manager?characterEncoding=utf8&serverTimezone=Asia/Shanghai
redis:
host: 192.168.206.142
port: 6379
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
hibernate:
ddl-auto: update
tx-lcn:
manager:
port: 9527
启动类加注解
@SpringBootApplication
@EnableTransactionManagerServer
public class TxManagerApplication {
public static void main(String[] args){
SpringApplication.run(TxManagerApplication.class,args);
}
}
订单和仓储服务实现分布式事务
订单服务要引入的依赖
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
application.yml文件新增配置
tx-lcn:
client:
manager-address: localhost:9527
启动类加注解 @EnableDistributedTransaction
service实现类的操作方法上添加@LcnTransaction注解
@Transactional
@LcnTransaction
@Override
public int updateStatus(PopOrderData pojo, String exp) {
int i = popOrderDataMapper.updateByPrimaryKeySelective(pojo);
Long id = pojo.getId();
PopOrderData popOrderData = popOrderDataMapper.selectByPrimaryKey(id);
Long orderId = popOrderData.getOrderId();
PopOrderItemExample example = new PopOrderItemExample();
PopOrderItemExample.Criteria criteria = example.createCriteria();
criteria.andOrderIdEqualTo(orderId);
List<PopOrderItem> popOrderItems = popOrderItemMapper.selectByExample(example);
PopOrderItem popOrderItem = popOrderItems.get(0);
Long skuId = popOrderItem.getSkuId();
//更新仓库
int updateProduct = houseFeignClient.updateProduct(skuId, 1);
if("1".equals(exp)) {
//人为制造异常
int v = 100 / 0;
}
return i+updateProduct;
}
仓储服务
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
application.yml文件新增配置
tx-lcn:
client:
manager-address: localhost:9527
启动类加注解 @EnableDistributedTransaction
service实现类的操作方法上添加@LcnTransaction注解
@Transactional //让spring来控制这个本地事务,防止出现异常的时候不回滚
@LcnTransaction(propagation = DTXPropagation.SUPPORTS)//使用LCN进行事务的管理,
// 表示当前方法中没有事务,如果其他方法(有事务)中调用到了当前方法,那当前方法就加入事务。
public int updateHouse(Long skuId, int cnt) {
WarehouseProductExample example = new WarehouseProductExample();
WarehouseProductExample.Criteria criteria = example.createCriteria();
criteria.andProductIdEqualTo(skuId.intValue());
List<WarehouseProduct> warehouseProducts = warehouseProductMapper.selectByExample(example);
WarehouseProduct warehouseProduct = warehouseProducts.get(0);
warehouseProduct.setCurrentCnt(warehouseProduct.getCurrentCnt()+cnt);
int i = warehouseProductMapper.updateByPrimaryKeySelective(warehouseProduct);
return i;
}
gitee地址:
https://gitee.com/fengyabin/springcloud-2009-openapi.git