免费A级毛片无码专区网站-成人国产精品视频一区二区-啊 日出水了 用力乖乖在线-国产黑色丝袜在线观看下-天天操美女夜夜操美女-日韩网站在线观看中文字幕-AV高清hd片XXX国产-亚洲av中文字字幕乱码综合-搬开女人下面使劲插视频

SpringCloud整合分布式事務(wù)Seata 1.4.1 支持微服務(wù)全局異常攔截( 三 )

修改Seata在nacos配置中心配置將client.undo.logSerialization=jackson修改為client.undo.logSerialization=kryo

SpringCloud整合分布式事務(wù)Seata 1.4.1 支持微服務(wù)全局異常攔截

文章插圖
微服務(wù)整合Seata前期準(zhǔn)備在每個(gè)微服務(wù)所連的庫(kù) , 新建一張表
-- 注意此處0.3.0+ 增加唯一索引 ux_undo_logCREATE TABLE `undo_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`branch_id` bigint(20) NOT NULL,`xid` varchar(100) NOT NULL,`context` varchar(128) NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int(11) NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;聚合工程搭建。。。。
項(xiàng)目結(jié)構(gòu)
  • ybchen-common:公共模塊
  • ybchen-order-service:訂單微服務(wù)
  • ybchen-product-service:商品微服務(wù)
數(shù)據(jù)庫(kù)分表為:order(訂單微服務(wù)庫(kù))、product(商品微服務(wù)庫(kù))、seata(Seata全局事務(wù)涉及的表)、nacos(Nacos配置中心 , mysql持久化)
SpringCloud整合分布式事務(wù)Seata 1.4.1 支持微服務(wù)全局異常攔截

文章插圖
Seata依賴<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.1</version></dependency><!-- seata 自身序列化bug問(wèn)題-開始 --><dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo</artifactId><version>4.0.2</version></dependency><dependency><groupId>de.javakaffee</groupId><artifactId>kryo-serializers</artifactId><version>0.42</version></dependency><!-- seata 自身序列化bug問(wèn)題-結(jié)束 -->分布式事務(wù)演示關(guān)鍵代碼片段
order-service
@AutowiredOrderMapper orderMapper;@AutowiredProductStockControllerFeign productStockControllerFeign;@Override//開啟分布式事務(wù) Seta AT模式@GlobalTransactionalpublic ReturnT<String> add() {OrderDO orderDO = new OrderDO();int outTradeNo = new Random().nextInt(1000);orderDO.setOutTradeNo("T" + outTradeNo);orderDO.setCreateTime(new Date());int rows = orderMapper.insert(orderDO);if (rows > 0) {//扣減商品庫(kù)存ReturnT<String> reduceReturn = productStockControllerFeign.reduce();if (ReturnT.isSuccess(reduceReturn)) {log.info("購(gòu)買成功");//TODO 模擬異常方式二//int num = 1 / 0;return ReturnT.buildSuccess("購(gòu)買成功");}// 解決全局?jǐn)r截器問(wèn)題 , 通過(guò)接口響應(yīng)狀態(tài)碼 , 來(lái)判斷是否主動(dòng)拋異常!!!!!!!if (reduceReturn.getCode() != 0) {log.info("扣減商品庫(kù)存失敗 , 接口響應(yīng):{}", reduceReturn);throw new BizException(110, "扣減商品庫(kù)存失敗");}log.info("扣減商品庫(kù)存失敗");return ReturnT.buildError("扣減商品庫(kù)存失敗");}log.info("購(gòu)買失敗");return ReturnT.buildError("購(gòu)買失敗");}product-service
@AutowiredProductStockMapper productStockMapper;@Overridepublic ReturnT<String> reduceProductStock() {ProductStockDO stockDO = new ProductStockDO();stockDO.setProductId(10086);stockDO.setBuyNum(1);stockDO.setCreateTime(new Date());int rows = productStockMapper.insert(stockDO);//TODO 模擬異常方式一//int num = 1 / 0;if (rows > 0) {log.info("扣減商品庫(kù)存成功 , rows=" + rows);return ReturnT.buildSuccess("扣減商品庫(kù)存成功");} else {log.info("扣減商品庫(kù)存失敗 , rows=" + rows);return ReturnT.buildError("扣減失敗");}}

經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀