网站都需要续费,网站开发技术说明文档,wordpress主题模板 国人,孝感网站开发公司一.Seata-server搭建已完成前提下
详见 Seata-server搭建
二.Springcloud 项目集成Seata
项目整体测试业务逻辑是创建订单后#xff08;为了演示分布式事务#xff0c;不做前置库存校验#xff09;#xff0c;再去扣减库存。库存不够的时候#xff0c;创建的订单信息数…一.Seata-server搭建已完成前提下
详见 Seata-server搭建
二.Springcloud 项目集成Seata
项目整体测试业务逻辑是创建订单后为了演示分布式事务不做前置库存校验再去扣减库存。库存不够的时候创建的订单信息数据也会回退。
2.1 springbootspringcloudspringbootseata项目版本的版本管理pom配置 !-- 统一依赖版本管理 --propertiesspring.boot.version2.6.11/spring.boot.versionspring-cloud.version2021.0.4/spring-cloud.versionspring-cloud-alibaba.version2021.0.4.0/spring-cloud-alibaba.versionseata.version1.5.2/seata.versionproject.build.sourceEncodingUTF-8/project.build.sourceEncoding/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring.boot.version}/versiontypepom/typescopeimport/scopeexclusionsexclusiongroupIdmysql/groupIdartifactIdmysql-connector-java/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement2.2 Porduct项目seata核心依赖和配置及代码和undolog表初始化
基本的web持久化数据库数据配置中心注册中心依赖此处略。 核心pom.xml如下 !--seata 分布式事务组件--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependencyappliction.yml 核心配置如下
# 端口
server:port: 8050servlet:context-path: /productApispring:application:name: dolphin-jinyi-productprofiles:active: devmvc:pathmatch:matching-strategy: ant_path_matchermain:allow-bean-definition-overriding: truecloud:nacos:# 注册中心discovery:server-addr: localhost:8848namespace: d6eccad6-681c-4133-b9ff-1abcd951297agroup: DOLPHIN_GROUP# 配置中心config:server-addr: localhost:8848file-extension: ymlgroup: DOLPHIN_GROUPnamespace: d6eccad6-681c-4133-b9ff-1abcd951297a# 这里可以配置多个共享配置文件shared-configs:- data-id: mysql-common.ymlgroup: DEFAULT_GROUPrefresh: true- data-id: redis-common.ymlgroup: DEFAULT_GROUPrefresh: true
logging:level:io:seata: INFO
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplseata:registry:# 配置seata的注册中心 告诉seata client 怎么去访问seata server(TC)type: nacosnacos:server-addr: 127.0.0.1:8848 # seata server 所在的nacos服务地址application: seata-server # seata server 的服务名seata-server 如果没有修改可以不配username: nacospassword: nacosgroup: DOLPHIN_GROUP # seata server 所在的组默认就是SEATA_GROUP没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297aconfig:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: DOLPHIN_GROUP # seata server 所在的组默认就是SEATA_GROUP没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297a#指定Nacos上的DataIddata-id: seata-server.ymltx-service-group: default_tx_group #这里每个服务都是对应不同的映射名,在配置中心可以看到 事务分组必须和服务器配置一样service:vgroup-mapping:default_tx_group: defaultgrouplist:default: localhost:8091java核心伪代码示例 */
RestController
RequestMapping(/product)
Api(value 商品Api, tags {商品Api})
public class ProductController {Resourceprivate IProductService productService;PostMapping(updateProductStock)ApiOperation(value updateProductStock-更新商品库存, notes updateProductStock-更新商品库存)public R updateProductStock(RequestParam(value productId) Integer productId,RequestParam(value num) Integer num) {productService.updateProductStock(productId,num);return R.ok();}
}public interface IProductService extends IServiceProduct {void updateProductStock(Integer productId, Integer num);
}注核心点在于根据产品id扣减库存的方法上需要分支事务 Transactional(rollbackFor Exception.class)注解。
Service
public class ProductServiceImpl extends ServiceImplProductMapper, Product implements IProductService {OverrideTransactional(rollbackFor Exception.class)public void updateProductStock(Integer productId, Integer num) {System.out.println(事务id---------------------- RootContext.getXID());LambdaQueryWrapperProduct queryWrapper new LambdaQueryWrapperProduct().eq(Product::getProductId, productId).eq(Product::getStatus, 1).last(limit 1);Product product this.getOne(queryWrapper);if (Objects.isNull(product)) {//商品不存在时抛异常throw new BizException(ResultCodeEnum.DATA_NOT_FOUND);}Integer stockNum product.getStockNum() num;if (stockNum 0) {//库存不足时抛异常throw new BizException(ResultCodeEnum.PRODUCT_STOCK_NOT_ENOUGH);}product.setStockNum(stockNum);this.updateById(product);}
}在product项目对应的数据库中初始化undo_log表
CREATE TABLE undo_log (branch_id bigint(20) NOT NULL COMMENT branch transaction id,xid varchar(128) NOT NULL COMMENT global transaction id,context varchar(128) NOT NULL COMMENT undo_log context,such as serialization,rollback_info longblob NOT NULL COMMENT rollback info,log_status int(11) NOT NULL COMMENT 0:normal status,1:defense status,log_created datetime(6) NOT NULL COMMENT create datetime,log_modified datetime(6) NOT NULL COMMENT modify datetime,UNIQUE KEY ux_undo_log (xid,branch_id),KEY ix_log_created (log_created)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENTAT transaction mode undo table;2.3 Order项目seata核心依赖和配置及代码和undolog表初始化
基本的web持久化数据库数据配置中心注册中心依赖此处略。 核心pom.xml如下 !--seata 分布式事务组件--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-seata/artifactId/dependencyappliction.yml 核心配置如下
# 端口
server:port: 8010servlet:context-path: /orderApispring:application:name: dolphin-jinyi-orderprofiles:active: devmvc:pathmatch:matching-strategy: ant_path_matchermain:allow-bean-definition-overriding: truecloud:nacos:# 注册中心discovery:server-addr: localhost:8848namespace: d6eccad6-681c-4133-b9ff-1abcd951297agroup: DOLPHIN_GROUP# 配置中心config:server-addr: localhost:8848file-extension: ymlgroup: DOLPHIN_GROUPnamespace: d6eccad6-681c-4133-b9ff-1abcd951297a# 这里可以配置多个共享配置文件shared-configs:- data-id: redis-common.ymlgroup: DEFAULT_GROUPrefresh: truemybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
seata:registry:# 配置seata的注册中心 告诉seata client 怎么去访问seata server(TC)type: nacosnacos:server-addr: 127.0.0.1:8848 # seata server 所在的nacos服务地址application: seata-server # seata server 的服务名seata-server 如果没有修改可以不配username: nacospassword: nacosgroup: DOLPHIN_GROUP # seata server 所在的组默认就是SEATA_GROUP没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297aconfig:type: nacosnacos:server-addr: 127.0.0.1:8848username: nacospassword: nacosgroup: DOLPHIN_GROUP # seata server 所在的组默认就是SEATA_GROUP没有改也可以不配namespace: d6eccad6-681c-4133-b9ff-1abcd951297a#指定Nacos上的DataIddata-id: seata-server.ymltx-service-group: default_tx_group #这里每个服务都是对应不同的映射名,在配置中心可以看到service:vgroup-mapping:default_tx_group: defaultgrouplist:default: localhost:8091
java核心伪代码示例
RestController
RequestMapping(/order)
Api(value 订单Api, tags {订单Api})
public class OrderController {Resourceprivate IOrderService orderService;ApiOperation(value createOrder-创建订单, notes createOrder-创建订单)PostMapping(/createOrder)public RLong createOrder(RequestBody Validated OrderCreateDTO orderCreateDTO) {Long orderNo orderService.createOrder(orderCreateDTO);return R.ok(orderNo);}
}public interface IOrderService extends IServiceOrder {Long createOrder(OrderCreateDTO orderCreateDTO);
}注核心注解 GlobalTransactional
Service
public class OrderServiceImpl extends ServiceImplOrderMapper, Order implements IOrderService {Resourceprivate ProductServiceFeignClient productServiceFeignClient;public Long createOrderNo() {return IdUtil.getSnowflakeNextId();}OverrideGlobalTransactionalpublic Long createOrder(OrderCreateDTO orderCreateDTO) {System.out.println(事务id---------------------- RootContext.getXID());Order order new Order();BeanUtil.copyProperties(orderCreateDTO, order);order.setOrderNo(this.createOrderNo());//创建订单this.insertOrder(order);//通过feign调用商品服务扣减库存productServiceFeignClient.updateProductStock(order.getProductId(), -1);return order.getOrderNo();}Transactional(rollbackFor Exception.class)public void insertOrder(Order order) {System.out.println(事务id A---------------------- RootContext.getXID());boolean save this.save(order);if (!save) {throw new BizException(ResultCodeEnum.SYSTEM_EXECUTION_ERROR);}}}在order项目对应的数据库中初始化undo_log表
CREATE TABLE undo_log (branch_id bigint(20) NOT NULL COMMENT branch transaction id,xid varchar(128) NOT NULL COMMENT global transaction id,context varchar(128) NOT NULL COMMENT undo_log context,such as serialization,rollback_info longblob NOT NULL COMMENT rollback info,log_status int(11) NOT NULL COMMENT 0:normal status,1:defense status,log_created datetime(6) NOT NULL COMMENT create datetime,log_modified datetime(6) NOT NULL COMMENT modify datetime,UNIQUE KEY ux_undo_log (xid,branch_id),KEY ix_log_created (log_created)
) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci COMMENTAT transaction mode undo table;三.设计到的nacos中的seata-server.yml等配置
注意上面项目的yml配置中的namespacegroupIddata-id 保持和nacos一直 seata-server.yml
service:vgroupMapping:default_tx_group: default四 测试
测试时保证seata-server order product 服务都已经启动。 现在库存有一个没有订单信息数据。
4.1 第一次下单 商品表库存被扣减创建订单成功 现在库存为0.第二次下单 订单没有新增库存也没有扣减。分布式事务测试ok