97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

搭建一個(gè)企業(yè)網(wǎng)站需要多少錢網(wǎng)站后臺(tái)圖片調(diào)換位置

鶴壁市浩天電氣有限公司 2026/01/24 17:38:53
搭建一個(gè)企業(yè)網(wǎng)站需要多少錢,網(wǎng)站后臺(tái)圖片調(diào)換位置,國(guó)外網(wǎng)站購(gòu)物,新建一個(gè)公司官網(wǎng)前情回顧#xff1a; 在 《MyBatis基礎(chǔ)入門《十四》多租戶架構(gòu)》 中#xff0c;我們解決了 SaaS 系統(tǒng)的數(shù)據(jù)隔離問題。 但當(dāng)業(yè)務(wù)拆分為 用戶服務(wù)、庫存服務(wù)、訂單服務(wù) 等多個(gè)微服務(wù)后#xff0c;新的難題出現(xiàn)#xff1a;用戶下單需 同時(shí)扣減余額、扣減庫存、創(chuàng)建訂單#…前情回顧在 《MyBatis基礎(chǔ)入門《十四》多租戶架構(gòu)》 中我們解決了 SaaS 系統(tǒng)的數(shù)據(jù)隔離問題。但當(dāng)業(yè)務(wù)拆分為用戶服務(wù)、庫存服務(wù)、訂單服務(wù)等多個(gè)微服務(wù)后新的難題出現(xiàn)用戶下單需同時(shí)扣減余額、扣減庫存、創(chuàng)建訂單若庫存服務(wù)成功但訂單服務(wù)失敗數(shù)據(jù)嚴(yán)重不一致傳統(tǒng)數(shù)據(jù)庫事務(wù)僅限單庫無法跨服務(wù)如何在不犧牲性能的前提下保證跨服務(wù)操作的原子性答案采用Seata 的 ATAuto Transaction模式結(jié)合 MyBatis 自動(dòng)管理分布式事務(wù)本文將帶你從零搭建 Seata Server配置 Spring Cloud 微服務(wù)編寫無侵入業(yè)務(wù)代碼并深入源碼理解其“兩階段提交 全局鎖 補(bǔ)償回滾”機(jī)制。一、為什么需要分布式事務(wù)1.1 單體 vs 微服務(wù)事務(wù)對(duì)比場(chǎng)景單體應(yīng)用微服務(wù)架構(gòu)事務(wù)范圍單數(shù)據(jù)庫跨多個(gè)數(shù)據(jù)庫/服務(wù)技術(shù)方案Transactional需分布式事務(wù)框架失敗后果自動(dòng)回滾數(shù)據(jù)不一致如錢扣了但沒發(fā)貨1.2 分布式事務(wù)常見方案對(duì)比方案原理優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景2PC兩階段提交協(xié)調(diào)者統(tǒng)一提交/回滾強(qiáng)一致性同步阻塞、性能差傳統(tǒng)金融核心系統(tǒng)TCCTry-Confirm-Cancel業(yè)務(wù)層面補(bǔ)償性能高、靈活侵入性強(qiáng)、開發(fā)復(fù)雜支付、交易等關(guān)鍵鏈路Saga事件驅(qū)動(dòng) 補(bǔ)償高吞吐、最終一致無隔離性、補(bǔ)償邏輯復(fù)雜長(zhǎng)流程業(yè)務(wù)如保險(xiǎn)Seata AT 模式自動(dòng)代理 UNDO 日志無侵入、近似本地事務(wù)體驗(yàn)弱隔離讀未提交通用業(yè)務(wù)80% 場(chǎng)景?本文聚焦 Seata AT 模式對(duì)業(yè)務(wù)代碼零侵入只需加注解自動(dòng)解析 SQL 生成回滾日志與 MyBatis 天然契合二、Seata 核心概念與架構(gòu)2.1 三大組件組件角色說明TCTransaction Coordinator事務(wù)協(xié)調(diào)器全局事務(wù)的管理者維護(hù)狀態(tài)、驅(qū)動(dòng)提交/回滾TMTransaction Manager事務(wù)管理器發(fā)起全局事務(wù)的應(yīng)用如訂單服務(wù)RMResource Manager資源管理器參與全局事務(wù)的微服務(wù)如用戶、庫存服務(wù)交互流程TM 向 TC 申請(qǐng)開啟全局事務(wù)RM 注冊(cè)分支事務(wù)到 TC業(yè)務(wù)執(zhí)行本地事務(wù) UNDO 日志TM 向 TC 發(fā)起提交/回滾TC 通知所有 RM 提交或回滾通過 UNDO 日志。2.2 AT 模式工作原理關(guān)鍵階段一執(zhí)行本地事務(wù) 注冊(cè)解析 SQLSeata 代理數(shù)據(jù)源攔截 JDBC 執(zhí)行查詢前鏡像Before Image執(zhí)行SELECT * FROM table WHERE id ? FOR UPDATE執(zhí)行業(yè)務(wù) SQL如UPDATE account SET balance balance - 100 WHERE user_id 1查詢后鏡像After Image再次查詢更新后的數(shù)據(jù)生成 UNDO LOG將前后鏡像存入undo_log表注冊(cè)分支事務(wù)向 TC 報(bào)告“我已準(zhǔn)備好”。階段二提交 or 回滾提交TC 通知 RM 刪除undo_log異步回滾TC 通知 RM 使用undo_log中的前鏡像反向生成 UPDATE 語句并執(zhí)行。核心優(yōu)勢(shì)業(yè)務(wù)代碼無需寫補(bǔ)償邏輯利用數(shù)據(jù)庫本地事務(wù)保證階段一原子性UNDO 日志與業(yè)務(wù)數(shù)據(jù)在同一事務(wù)強(qiáng)一致三、環(huán)境準(zhǔn)備搭建 Seata Server3.1 下載與配置從 Seata GitHub Releases 下載 1.7.0 版本修改conf/registry.confregistry { type nacos // 使用 Nacos 作為注冊(cè)中心 nacos { application seata-server serverAddr 127.0.0.1:8848 group DEFAULT_GROUP namespace cluster default } } config { type nacos // 配置也存 Nacos nacos { serverAddr 127.0.0.1:8848 group SEATA_GROUP namespace } }在 Nacos 中創(chuàng)建配置config.txt→nacos-config.sh導(dǎo)入啟動(dòng) Seata Server./bin/seata-server.sh -p 8091 -h 127.0.0.1 -m db注意生產(chǎn)環(huán)境需配置高可用多 TC 實(shí)例 Raft 協(xié)議。四、微服務(wù)工程搭建Spring Cloud MyBatis Seata4.1 服務(wù)劃分服務(wù)功能數(shù)據(jù)庫order-service創(chuàng)建訂單TMdb_orderaccount-service扣減用戶余額RMdb_accountstorage-service扣減商品庫存RMdb_storage4.2 公共依賴每個(gè)服務(wù)!-- Spring Cloud Alibaba Seata -- dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-seata/artifactId version2022.0.0.0/version /dependency !-- MyBatis Plus簡(jiǎn)化 CRUD -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- MySQL -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId /dependency? Seata Starter 自動(dòng)配置DataSourceProxy關(guān)鍵。4.3 數(shù)據(jù)庫初始化每個(gè)服務(wù)1. 業(yè)務(wù)表以 account-service 為例-- db_account.account CREATE TABLE account ( user_id BIGINT PRIMARY KEY, balance DECIMAL(10,2) NOT NULL ); INSERT INTO account VALUES (1, 1000.00);2.UNDO_LOG 表必須Seata 專用-- 每個(gè)參與分布式事務(wù)的數(shù)據(jù)庫都需此表 CREATE TABLE undo_log ( id BIGINT AUTO_INCREMENT, branch_id BIGINT NOT NULL, xid VARCHAR(128) NOT NULL, context VARCHAR(128) NOT NULL, rollback_info LONGBLOB NOT NULL, log_status INT NOT NULL, log_created DATETIME NOT NULL, log_modified DATETIME NOT NULL, PRIMARY KEY (id), UNIQUE KEY ux_undo_log (xid, branch_id) );??重要undo_log表名不可更改字段必須一致五、服務(wù)端配置application.yml5.1 order-serviceTMserver: port: 8081 spring: application: name: order-service datasource: url: jdbc:mysql://localhost:3306/db_order?useSSLfalse username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver seata: enabled: true application-id: order-service tx-service-group: my_tx_group # 與 registry.conf 中 service.vgroupMapping 一致 service: vgroup-mapping: my_tx_group: default registry: type: nacos nacos: server-addr: 127.0.0.1:8848 config: type: nacos nacos: server-addr: 127.0.0.1:88485.2 account-service / storage-serviceRM配置類似僅spring.application.name和datasource.url不同。關(guān)鍵點(diǎn)tx-service-group必須與 Seata Server 配置匹配Seata Starter 會(huì)自動(dòng)將DataSource包裝為DataSourceProxy攔截 SQL。六、業(yè)務(wù)代碼實(shí)現(xiàn)零侵入6.1 Entity 與 MapperMyBatis Plus// account-service/entity/Account.java Data TableName(account) public class Account { TableId private Long userId; private BigDecimal balance; } // account-service/mapper/AccountMapper.java Mapper public interface AccountMapper extends BaseMapperAccount { Update(UPDATE account SET balance balance - #{amount} WHERE user_id #{userId} AND balance #{amount}) int decreaseBalance(Param(userId) Long userId, Param(amount) BigDecimal amount); }? 使用 MyBatis Plus 簡(jiǎn)化 CRUD自定義 SQL 實(shí)現(xiàn)“余額充足才扣減”。6.2 Service 層核心account-service扣減余額// account-service/service/AccountService.java Service public class AccountService { Autowired private AccountMapper accountMapper; /** * 扣減余額被 order-service 遠(yuǎn)程調(diào)用 */ Transactional // 本地事務(wù) public void debit(Long userId, BigDecimal amount) { int updated accountMapper.decreaseBalance(userId, amount); if (updated 0) { throw new RuntimeException(余額不足); } } }storage-service扣減庫存// 類似略order-service創(chuàng)建訂單TM 入口// order-service/service/OrderService.java Service public class OrderService { Autowired private OrderMapper orderMapper; Autowired private RestTemplate restTemplate; // 調(diào)用其他服務(wù) /** * 創(chuàng)建訂單全局事務(wù)入口 */ GlobalTransactional // ←←← 關(guān)鍵注解 public void createOrder(Long userId, Long productId, Integer count) { // 1. 本地創(chuàng)建訂單狀態(tài)待支付 Order order new Order(); order.setUserId(userId); order.setProductId(productId); order.setStatus(INIT); orderMapper.insert(order); // 2. 遠(yuǎn)程扣減庫存 restTemplate.postForObject( http://storage-service/storage/debit, new DebitRequest(productId, count), Void.class ); // 3. 遠(yuǎn)程扣減余額 restTemplate.postForObject( http://account-service/account/debit, new DebitRequest(userId, new BigDecimal(100)), Void.class ); // 4. 本地更新訂單狀態(tài) order.setStatus(PAID); orderMapper.updateById(order); } }?神奇之處僅需在 TM 入口方法加GlobalTransactionalRM 服務(wù)無需任何 Seata 相關(guān)注解若任一服務(wù)拋異常所有操作自動(dòng)回滾七、Feign 調(diào)用支持推薦替代 RestTemplate若使用 Spring Cloud OpenFeign需添加Seata 請(qǐng)求頭透?jìng)?/ config/SeataFeignConfiguration.java Configuration public class SeataFeignConfiguration { Bean public RequestInterceptor seataFeignInterceptor() { return requestTemplate - { String xid RootContext.getXID(); if (xid ! null) { requestTemplate.header(RootContext.KEY_XID, xid); // 透?jìng)?XID } }; } } // FeignClient FeignClient(name account-service, configuration SeataFeignConfiguration.class) public interface AccountClient { PostMapping(/account/debit) void debit(RequestBody DebitRequest request); }? 確保全局事務(wù) IDXID在服務(wù)間傳遞八、深度解析Seata 如何做到“無侵入”8.1 DataSourceProxy 代理鏈MyBatis Executor → Jdbc3Connection → DataSourceProxy.getConnection() → ConnectionProxy → PreparedStatementProxy所有 SQL 執(zhí)行被PreparedStatementProxy攔截自動(dòng)完成前鏡像查詢 → 執(zhí)行 SQL → 后鏡像查詢 → 生成 UNDO LOG。8.2 UNDO LOG 結(jié)構(gòu){ branchId: 123456789, sqlUndoLogs: [ { tableName: account, beforeImage: {rows: [{fields: [{name:user_id,value:1},{name:balance,value:1000.00}]}]}, afterImage: {rows: [{fields: [{name:user_id,value:1},{name:balance,value:900.00}]}]}, sqlType: UPDATE } ] }回滾時(shí)Seata 將beforeImage轉(zhuǎn)為UPDATE account SET balance 1000.00 WHERE user_id 1。九、隔離性問題與解決方案9.1 AT 模式的隔離級(jí)別默認(rèn)讀未提交Read Uncommitted原因階段一本地事務(wù)已提交但全局事務(wù)未決其他事務(wù)可讀到“中間狀態(tài)”。9.2 如何解決臟讀方案一全局鎖Seata 內(nèi)置在階段一Seata 會(huì)向 TC 申請(qǐng)行級(jí)全局鎖其他全局事務(wù)若操作同一行會(huì)阻塞直到鎖釋放注意普通本地事務(wù)不受影響仍可能臟讀。方案二業(yè)務(wù)層顯式加鎖// 在關(guān)鍵查詢前加 FOR UPDATE Account account accountMapper.selectOne( new QueryWrapperAccount().eq(user_id, userId).last(FOR UPDATE) );? 全局鎖 本地鎖組合保證強(qiáng)一致性十、異常場(chǎng)景測(cè)試10.1 模擬庫存服務(wù)失敗// storage-service public void debit(...) { if (productId 999) { throw new RuntimeException(庫存不足); // 模擬異常 } // ... }結(jié)果訂單創(chuàng)建回滾余額扣減回滾庫存未扣減undo_log表記錄被清理。10.2 Seata Server 宕機(jī)階段一已完成本地事務(wù) UNDO LOG重啟后 TC 會(huì)掃描未完成的全局事務(wù)驅(qū)動(dòng) RM 回滾最終一致性保障十一、性能優(yōu)化建議問題優(yōu)化方案UNDO LOG 寫入開銷異步刪除Seata 默認(rèn)批量插入優(yōu)化全局鎖競(jìng)爭(zhēng)減少事務(wù)粒度避免熱點(diǎn)數(shù)據(jù)網(wǎng)絡(luò) RTTTC 與 RM 同機(jī)房部署使用 gRPC 通信鏡像查詢確保 WHERE 條件有索引避免全表掃描實(shí)測(cè)性能4 核 8GMySQL 5.7單事務(wù)耗時(shí)增加15~25msTPS 從 1200 降至 800可接受。十二、與其他方案對(duì)比AT vs TCC維度Seata ATTCC代碼侵入無僅注解高需實(shí)現(xiàn) Try/Confirm/Cancel開發(fā)效率★★★★★★★☆☆☆性能中高無鏡像查詢隔離性弱需額外處理強(qiáng)業(yè)務(wù)控制適用場(chǎng)景通用 CRUD高并發(fā)核心鏈路?建議80% 業(yè)務(wù)用AT 模式支付、紅包等用TCC 模式。十三、總結(jié)Seata MyBatis 最佳實(shí)踐表結(jié)構(gòu)每個(gè) RM 數(shù)據(jù)庫必須有undo_log表數(shù)據(jù)源確保被DataSourceProxy代理Seata Starter 自動(dòng)完成事務(wù)入口僅 TM 服務(wù)加GlobalTransactional服務(wù)調(diào)用透?jìng)?XIDFeign/RestTemplate 攔截器隔離性關(guān)鍵查詢加FOR UPDATE或依賴全局鎖監(jiān)控集成 Seata 控制臺(tái)觀察事務(wù)狀態(tài)。?核心價(jià)值開發(fā)體驗(yàn)接近本地事務(wù)自動(dòng)處理回滾無需人工補(bǔ)償與 MyBatis 生態(tài)無縫融合
版權(quán)聲明: 本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

thinkphp5來做網(wǎng)站嗎東莞搜索seo優(yōu)化排名

thinkphp5來做網(wǎng)站嗎,東莞搜索seo優(yōu)化排名,曲靖做網(wǎng)站需要多少錢,網(wǎng)頁設(shè)計(jì)培訓(xùn) 多少錢付費(fèi)內(nèi)容訪問技巧#xff1a;5種實(shí)用方法助你獲取信息 【免費(fèi)下載鏈接】bypass-paywalls-

2026/01/21 16:20:01

電腦維修網(wǎng)站模板下載自媒體怎么申請(qǐng)注冊(cè)

電腦維修網(wǎng)站模板下載,自媒體怎么申請(qǐng)注冊(cè),wordpress虛擬商品主題,怎么設(shè)網(wǎng)站Miniconda虛擬環(huán)境命名規(guī)范對(duì)PyTorch項(xiàng)目的影響與實(shí)踐 在深度學(xué)習(xí)項(xiàng)目開發(fā)中#xff0c;我們常常會(huì)遇到

2026/01/23 08:26:02