惠州网站建设报价微网站 案例

张小明 2026/1/6 16:19:54
惠州网站建设报价,微网站 案例,商业网站建设教程,国内永久免费saas crm#x1f680; 分布式事务深度解析#xff1a;从本地事务到柔性事务的完整实战指南 在微服务架构盛行的今天#xff0c;分布式事务已经成为每个后端工程师必须掌握的核心技能。本文将从本地事务出发#xff0c;循序渐进地带你深入理解分布式事务的各种解决方案#xff0c;并… 分布式事务深度解析从本地事务到柔性事务的完整实战指南在微服务架构盛行的今天分布式事务已经成为每个后端工程师必须掌握的核心技能。本文将从本地事务出发循序渐进地带你深入理解分布式事务的各种解决方案并结合实战代码帮你快速落地 目录什么是事务从本地事务说起分布式场景下的挑战刚性事务强一致性的保证柔性事务最终一致性的艺术Seata阿里巴巴开源的分布式事务解决方案生产实践与选型建议1. 什么是事务从本地事务说起1.1 ACID特性回顾事务是数据库操作的基本单元具有四大特性ACID原子性Atomicity事务中的所有操作要么全部成功要么全部失败一致性Consistency事务执行前后数据保持一致状态隔离性Isolation多个事务并发执行时相互隔离持久性Durability事务提交后数据永久保存1.2 本地事务示例在单体应用中本地事务非常简单ServicepublicclassOrderService{AutowiredprivateJdbcTemplatejdbcTemplate;TransactionalpublicvoidcreateOrder(Orderorder){// 1. 插入订单主表jdbcTemplate.update(INSERT INTO orders (user_id, total_amount, status) VALUES (?, ?, ?),order.getUserId(),order.getTotalAmount(),CREATED);// 2. 插入订单明细for(OrderItemitem:order.getItems()){jdbcTemplate.update(INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?, ?, ?, ?),order.getId(),item.getProductId(),item.getQuantity(),item.getPrice());}// 3. 更新库存jdbcTemplate.update(UPDATE products SET stock stock - ? WHERE id ?,item.getQuantity(),item.getProductId());// 如果任何一步失败整个事务回滚}}优点实现简单使用Transactional注解即可性能高数据库原生支持强一致性ACID 完全保证局限只能在单个数据库内使用无法跨服务、跨数据库2. 分布式场景下的挑战2.1 电商下单场景在微服务架构中一个业务流程可能涉及多个服务// 订单服务ServicepublicclassOrderService{AutowiredprivateStockServiceClientstockService;AutowiredprivateAccountServiceClientaccountService;publicvoidplaceOrder(OrderRequestrequest){// 1. 创建订单订单服务的数据库OrderordercreateOrder(request);// 2. 扣减库存库存服务的数据库stockService.deductStock(request.getProductId(),request.getQuantity());// 3. 扣减账户余额账户服务的数据库accountService.deductBalance(request.getUserId(),order.getTotalAmount());// 问题如果第3步失败前两步已经提交如何回滚}}2.2 面临的问题网络延迟和故障服务间调用可能超时或失败部分成功订单创建成功但扣款失败数据不一致各服务数据库状态不同步难以回滚每个服务的事务独立提交CAP 定理在分布式系统中一致性Consistency、可用性Availability、分区容错性Partition Tolerance三者不可兼得最多只能同时满足两个。3. 刚性事务强一致性的保证刚性事务追求强一致性保证分布式环境下的 ACID 特性。3.1 2PC两阶段提交执行流程阶段一准备阶段Prepare协调者询问所有参与者是否可以提交事务参与者执行事务但不提交返回 Yes/No阶段二提交阶段Commit如果所有参与者都返回 Yes协调者发送 Commit 指令如果有任何一个返回 No协调者发送 Rollback 指令// 使用 JTAJava Transaction API实现 2PCTransactionalpublicclassDistributedOrderService{Resource(nameorderDataSource)privateDataSourceorderDS;Resource(namestockDataSource)privateDataSourcestockDS;publicvoidplaceOrder(OrderRequestrequest)throwsException{// 获取 UserTransactionUserTransactionuserTransaction(UserTransaction)newInitialContext().lookup(java:comp/UserTransaction);try{// 开启全局事务userTransaction.begin();// 操作订单数据库ConnectionorderConnorderDS.getConnection();orderConn.createStatement().execute(INSERT INTO orders (user_id, amount) VALUES (request.getUserId(),request.getAmount()));// 操作库存数据库ConnectionstockConnstockDS.getConnection();stockConn.createStatement().execute(UPDATE stock SET quantity quantity - request.getQuantity() WHERE product_id request.getProductId());// 提交全局事务userTransaction.commit();}catch(Exceptione){// 回滚全局事务userTransaction.rollback();throwe;}}}优点强一致性符合 ACID 原则实现相对简单缺点同步阻塞所有参与者等待协调者指令期间会阻塞单点故障协调者挂了整个系统不可用数据不一致第二阶段部分参与者收不到指令性能差锁定资源时间长3.2 3PC三阶段提交3PC 在 2PC 基础上增加了一个预提交阶段减少阻塞时间阶段一CanCommit询问协调者询问参与者是否可以执行事务参与者只做预检查不锁定资源阶段二PreCommit预提交协调者发送预提交请求参与者执行事务并锁定资源但不提交阶段三DoCommit提交协调者发送最终提交或回滚指令参与者执行指令并释放资源改进点引入超时机制减少阻塞预提交阶段提前发现问题参与者可以在超时后自动提交默认成功缺点实现更复杂仍然存在数据不一致风险性能开销更大4. 柔性事务最终一致性的艺术柔性事务放弃强一致性追求最终一致性更适合互联网高并发场景。4.1 TCCTry-Confirm-CancelTCC 将事务分为三个阶段Try尝试预留业务资源检查并锁定Confirm确认执行真正的业务逻辑Cancel取消释放资源回滚操作// 库存服务 - TCC 接口实现ServicepublicclassStockTccService{AutowiredprivateStockMapperstockMapper;/** * Try 阶段冻结库存 */publicbooleantryDeduct(LongproductId,Integerquantity,StringorderId){StockstockstockMapper.selectById(productId);// 检查库存是否充足if(stock.getAvailable()quantity){returnfalse;}// 冻结库存available - quantity, frozen quantityintupdatedstockMapper.freezeStock(productId,quantity);// 记录冻结日志stockMapper.insertFreezeLog(orderId,productId,quantity,TRY);returnupdated0;}/** * Confirm 阶段确认扣减 */publicbooleanconfirmDeduct(StringorderId){FreezeLoglogstockMapper.selectFreezeLog(orderId);// 扣减冻结的库存frozen - quantityintupdatedstockMapper.deductFrozenStock(log.getProductId(),log.getQuantity());// 更新日志状态stockMapper.updateFreezeLog(orderId,CONFIRM);returnupdated0;}/** * Cancel 阶段释放库存 */publicbooleancancelDeduct(StringorderId){FreezeLoglogstockMapper.selectFreezeLog(orderId);// 解冻库存available quantity, frozen - quantityintupdatedstockMapper.unfreezeStock(log.getProductId(),log.getQuantity());// 更新日志状态stockMapper.updateFreezeLog(orderId,CANCEL);returnupdated0;}}// 订单服务 - TCC 事务协调ServicepublicclassOrderTccCoordinator{AutowiredprivateStockTccServicestockTccService;AutowiredprivateAccountTccServiceaccountTccService;publicvoidplaceOrder(OrderRequestrequest){StringorderIdUUID.randomUUID().toString();try{// Try 阶段booleanstockOkstockTccService.tryDeduct(request.getProductId(),request.getQuantity(),orderId);booleanaccountOkaccountTccService.tryDeduct(request.getUserId(),request.getAmount(),orderId);if(stockOkaccountOk){// Confirm 阶段stockTccService.confirmDeduct(orderId);accountTccService.confirmDeduct(orderId);}else{// Cancel 阶段if(stockOk)stockTccService.cancelDeduct(orderId);if(accountOk)accountTccService.cancelDeduct(orderId);}}catch(Exceptione){// 异常时 CancelstockTccService.cancelDeduct(orderId);accountTccService.cancelDeduct(orderId);}}}优点不依赖数据库事务性能更好可以跨数据库、跨服务业务逻辑清晰缺点代码侵入性强需要实现三个方法开发成本高需要考虑幂等性和悬挂问题4.2 Saga 模式Saga 将长事务拆分为多个本地短事务每个事务都有对应的补偿事务。// Saga 编排示例ServicepublicclassOrderSagaService{AutowiredprivateOrderServiceorderService;AutowiredprivateStockServicestockService;AutowiredprivateAccountServiceaccountService;publicvoidplaceOrder(OrderRequestrequest){ListCompensationcompensationsnewArrayList();try{// 步骤 1创建订单OrderorderorderService.createOrder(request);compensations.add(()-orderService.cancelOrder(order.getId()));// 步骤 2扣减库存stockService.deductStock(request.getProductId(),request.getQuantity());compensations.add(()-stockService.addStock(request.getProductId(),request.getQuantity()));// 步骤 3扣减余额accountService.deductBalance(request.getUserId(),request.getAmount());compensations.add(()-accountService.addBalance(request.getUserId(),request.getAmount()));// 所有步骤成功orderService.confirmOrder(order.getId());}catch(Exceptione){// 逆序执行补偿操作for(inticompensations.size()-1;i0;i--){try{compensations.get(i).compensate();}catch(Exceptionex){// 记录补偿失败人工介入log.error(补偿失败: {},ex.getMessage());}}thrownewBusinessException(下单失败);}}}FunctionalInterfaceinterfaceCompensation{voidcompensate();}优点长事务拆分不会长时间锁定资源业务流程灵活适合复杂业务场景缺点不保证隔离性可能出现脏读补偿逻辑复杂需要处理补偿失败的情况4.3 可靠消息最终一致性通过消息队列实现异步事务保证最终一致性。// 订单服务 - 发送可靠消息ServicepublicclassOrderMessageService{AutowiredprivateRocketMQTemplaterocketMQTemplate;AutowiredprivateOrderMapperorderMapper;TransactionalpublicvoidcreateOrderWithMessage(OrderRequestrequest){// 1. 创建订单本地事务OrderordernewOrder();order.setUserId(request.getUserId());order.setAmount(request.getAmount());order.setStatus(PENDING);orderMapper.insert(order);// 2. 发送事务消息确保消息和订单在同一事务中rocketMQTemplate.sendMessageInTransaction(order-topic,MessageBuilder.withPayload(order).build(),null);}// 事务消息监听器RocketMQTransactionListenerclassOrderTransactionListenerimplementsRocketMQLocalTransactionListener{OverridepublicRocketMQLocalTransactionStateexecuteLocalTransaction(Messagemsg,Objectarg){try{// 本地事务已在 createOrderWithMessage 中执行returnRocketMQLocalTransactionState.COMMIT;}catch(Exceptione){returnRocketMQLocalTransactionState.ROLLBACK;}}OverridepublicRocketMQLocalTransactionStatecheckLocalTransaction(Messagemsg){// 回查本地事务状态OrderorderJSON.parseObject(msg.getPayload(),Order.class);OrderdbOrderorderMapper.selectById(order.getId());if(dbOrder!null){returnRocketMQLocalTransactionState.COMMIT;}else{returnRocketMQLocalTransactionState.ROLLBACK;}}}}// 库存服务 - 消费消息ServiceRocketMQMessageListener(topicorder-topic,consumerGroupstock-consumer)publicclassStockMessageConsumerimplementsRocketMQListenerOrder{AutowiredprivateStockServicestockService;OverridepublicvoidonMessage(Orderorder){try{// 执行扣减库存需要保证幂等性stockService.deductStock(order.getProductId(),order.getQuantity());}catch(Exceptione){// 消费失败消息会重试log.error(扣减库存失败: {},e.getMessage());thrownewRuntimeException(e);}}}关键点事务消息确保消息发送和本地事务绑定消息回查MQ 定期回查本地事务状态幂等性消费者需要实现幂等防止重复消费优点性能高异步处理解耦服务间依赖吞吐量大缺点最终一致性存在延迟消息可能丢失或重复需要额外的消息中间件4.4 最大努力通知适用于对一致性要求不高的场景通过重试机制尽最大努力通知。ServicepublicclassNotificationService{AutowiredprivateRestTemplaterestTemplate;AutowiredprivateNotificationLogMapperlogMapper;/** * 发送通知失败后定时重试 */publicvoidsendNotification(StringtargetUrl,Objectdata){// 记录通知日志NotificationLoglognewNotificationLog();log.setTargetUrl(targetUrl);log.setData(JSON.toJSONString(data));log.setRetryCount(0);log.setStatus(PENDING);logMapper.insert(log);// 异步发送executeNotification(log);}privatevoidexecuteNotification(NotificationLoglog){try{// 发送 HTTP 请求ResponseEntityStringresponserestTemplate.postForEntity(log.getTargetUrl(),log.getData(),String.class);if(response.getStatusCode().is2xxSuccessful()){// 成功log.setStatus(SUCCESS);logMapper.updateById(log);}else{// 失败等待重试scheduleRetry(log);}}catch(Exceptione){// 异常等待重试scheduleRetry(log);}}/** * 定时重试任务 */Scheduled(fixedDelay60000)// 每分钟执行一次publicvoidretryFailedNotifications(){ListNotificationLogpendingLogslogMapper.selectPendingLogs();for(NotificationLoglog:pendingLogs){if(log.getRetryCount()5){// 超过最大重试次数标记为失败log.setStatus(FAILED);logMapper.updateById(log);// 发送告警人工介入alertService.sendAlert(通知失败: log.getTargetUrl());}else{// 增加重试次数log.setRetryCount(log.getRetryCount()1);logMapper.updateById(log);// 重新发送executeNotification(log);}}}}适用场景支付结果通知订单状态通知对账场景5. Seata阿里巴巴开源的分布式事务解决方案5.1 Seata 架构Seata 包含三大角色TCTransaction Coordinator事务协调器维护全局事务和分支事务的状态TMTransaction Manager事务管理器定义全局事务的范围RMResource Manager资源管理器管理分支事务的资源5.2 AT 模式实战AT 模式是 Seata 的默认模式对业务代码几乎无侵入。// 1. 引入依赖Spring Boot/* dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-seata/artifactId /dependency */// 2. 配置文件/* seata: enabled: true application-id: order-service tx-service-group: my_tx_group registry: type: nacos nacos: server-addr: 127.0.0.1:8848 */// 3. 业务代码 - 订单服务ServicepublicclassOrderServiceImpl{AutowiredprivateStockServiceClientstockService;AutowiredprivateAccountServiceClientaccountService;AutowiredprivateOrderMapperorderMapper;GlobalTransactional(namecreate-order,rollbackForException.class)publicvoidcreateOrder(OrderRequestrequest){// 1. 创建订单OrderordernewOrder();order.setUserId(request.getUserId());order.setAmount(request.getAmount());orderMapper.insert(order);// 2. 远程调用库存服务stockService.deduct(request.getProductId(),request.getQuantity());// 3. 远程调用账户服务accountService.deduct(request.getUserId(),request.getAmount());// 任何一步失败Seata 会自动回滚所有操作}}// 4. 库存服务只需要本地事务ServicepublicclassStockServiceImpl{AutowiredprivateStockMapperstockMapper;Transactionalpublicvoiddeduct(LongproductId,Integerquantity){stockMapper.deduct(productId,quantity);}}5.3 AT 模式原理一阶段解析 SQL生成前后镜像before image after image执行业务 SQL提交本地事务释放本地锁向 TC 注册分支事务二阶段如果成功删除 undo log完成如果失败根据 undo log 生成反向 SQL回滚数据优势无代码侵入性能高一阶段即提交自动生成回滚 SQL6. 生产实践与选型建议6.1 方案对比方案一致性性能复杂度适用场景2PC/3PC强一致低低金融核心系统TCC最终一致高高资金交易Saga最终一致高中长流程业务可靠消息最终一致很高中高并发场景最大努力通知弱一致很高低通知类场景Seata AT最终一致高低通用场景6.2 选型建议强一致性要求选择 2PC 或 Seata XA 模式高性能要求选择可靠消息或 Saga快速落地选择 Seata AT 模式资金类业务选择 TCC长流程业务选择 Saga通知场景选择最大努力通知6.3 最佳实践幂等设计所有接口必须支持幂等超时控制设置合理的超时时间监控告警监控事务成功率和耗时降级方案准备人工补偿流程日志记录详细记录事务执行过程
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

能够制作网页的软件手机优化大师官方版

企业知识库怎么选?Anything-LLM vs 其他RAG工具对比 在企业数字化转型的浪潮中,一个常被忽视却影响深远的问题浮出水面:员工每天花多少时间在找文档? 会议纪要存在哪个网盘?最新版产品说明书更新了吗?报销流…

张小明 2026/1/3 11:38:10 网站建设

长沙网站制作好公司集团公司网站源码

核心问题解答: 电脑键盘鼠标突然失灵、卡顿或按键错乱怎么办?这通常是由于驱动程序冲突、丢失或版本不匹配引起的。解决这一问题的核心在于重新匹配并安装正确的驱动程序。相比于手动去设备管理器排查和官网搜寻驱动,使用专业的自动化工具&am…

张小明 2026/1/3 3:23:20 网站建设

dreamwearver可以做网站吗add_filter wordpress

想要在PotPlayer中享受实时字幕翻译的便利体验吗?这款基于百度翻译API的字幕翻译工具能够让你轻松观看多语言视频内容,实现高效的字幕转换功能。通过本指南,即使是初次使用的用户也能快速完成配置,享受流畅的多语言视频观看体验。…

张小明 2026/1/3 9:28:55 网站建设

西安网站开发培训多少钱西宁摄网站制作

专研墙角灯的企业,竟因“不务正业”火出圈?背后的逻辑,照明人都该看看“只懂得埋头打磨一颗螺丝钉,在今天的时代,远不足以构建真正的壁垒。真正的专家,是能跳出产品本身,为客户解决一整个系统级…

张小明 2026/1/5 4:42:34 网站建设

电影网站可以备案吗织梦官网模板

摘要 随着社会对动物福利的关注度不断提升,动物领养平台的需求日益增长。传统的线下领养模式存在信息不对称、流程繁琐等问题,亟需一种高效、透明的线上解决方案。基于此背景,本研究设计并实现了一个基于Java Web的动物领养平台系统&#xff…

张小明 2026/1/6 7:05:02 网站建设

重庆知名网站seo分析报告

在产品研发与生产管理领域,失效模式与影响分析(FMEA)是保障质量与可靠性的核心工具之一。而 “失效模式” 作为 FMEA 的基础概念,是指产品或过程在运行中可能出现的功能异常状态。了解这些失效模式,是识别风险、制定预…

张小明 2026/1/4 15:46:23 网站建设