<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      分布式事務(wù)之2PC兩階段提交

      1. 分布式事務(wù)概述

      1.1 問題背景

      在分布式系統(tǒng)中,業(yè)務(wù)操作可能跨越多個服務(wù)或數(shù)據(jù)庫(如訂單服務(wù)、庫存服務(wù)、支付服務(wù)),傳統(tǒng)單機(jī)事務(wù)(ACID)無法滿足跨網(wǎng)絡(luò)節(jié)點(diǎn)的數(shù)據(jù)一致性需求。

      • 網(wǎng)絡(luò)不可靠:服務(wù)間調(diào)用可能失敗或超時。
      • 數(shù)據(jù)一致性:不同節(jié)點(diǎn)間的狀態(tài)需最終一致。
      • 性能與可用性:避免長時間鎖資源導(dǎo)致系統(tǒng)阻塞。

      分布式事務(wù)的核心目標(biāo)是確保 跨服務(wù)/數(shù)據(jù)庫的操作要么全部成功,要么全部回滾

      2. 兩階段提交(2PC)

      原理

      • 階段一(Prepare):協(xié)調(diào)者詢問所有參與者是否可提交,參與者鎖定資源并返回“同意”或“拒絕”。
      • 階段二(Commit/Rollback):若所有參與者同意,協(xié)調(diào)者發(fā)送提交命令;否則發(fā)送回滾命令。

      以下是一個簡化的 Java 兩階段提交(2PC) 具體實(shí)現(xiàn)示例,包含協(xié)調(diào)者(Coordinator)和參與者(Participant)的核心邏輯。代碼通過模擬數(shù)據(jù)庫操作展示2PC的關(guān)鍵流程:


      1. 參與者(Participant)實(shí)現(xiàn)

      每個參與者代表一個獨(dú)立的數(shù)據(jù)庫或服務(wù),需支持準(zhǔn)備(Prepare)、提交(Commit)、回滾(Rollback)操作。

      import java.util.concurrent.atomic.AtomicBoolean;
      
      /**
       * 參與者(如數(shù)據(jù)庫或服務(wù))
       */
      public class Participant {
          private String name;          // 參與者名稱(如"DB1")
          private AtomicBoolean prepared = new AtomicBoolean(false);  // 準(zhǔn)備狀態(tài)
          private AtomicBoolean committed = new AtomicBoolean(false); // 提交狀態(tài)
      
          public Participant(String name) {
              this.name = name;
          }
      
          /**
           * 階段一:準(zhǔn)備操作(鎖定資源)
           * @return true表示準(zhǔn)備成功,false表示失敗
           */
          public boolean prepare() {
              try {
                  // 模擬資源鎖定,實(shí)際可能為操作數(shù)據(jù)庫
                  System.out.println(name + ": Trying to prepare...");
                  Thread.sleep(100);  // 模擬網(wǎng)絡(luò)延遲
                  boolean success = Math.random() > 0.2;  // 80%概率成功
                  if (success) {
                      prepared.set(true);
                      System.out.println(name + ": Prepared successfully.");
                      return true;
                  } else {
                      System.out.println(name + ": Prepare failed.");
                      return false;
                  }
              } catch (InterruptedException e) {
                  Thread.currentThread().interrupt();
                  return false;
              }
          }
      
          /**
           * 階段二:提交操作
           */
          public void commit() {
              if (prepared.get()) {
                  // 實(shí)際提交事務(wù)(如更新數(shù)據(jù)庫)
                  committed.set(true);
                  System.out.println(name + ": Committed.");
              } else {
                  System.out.println(name + ": Cannot commit without preparation.");
              }
          }
      
          /**
           * 階段二:回滾操作
           */
          public void rollback() {
              if (prepared.get()) {
                  // 實(shí)際回滾事務(wù)(如恢復(fù)數(shù)據(jù))
                  prepared.set(false);
                  System.out.println(name + ": Rolled back.");
              } else {
                  System.out.println(name + ": No need to rollback.");
              }
          }
      
          // 檢查是否已提交
          public boolean isCommitted() {
              return committed.get();
          }
      }
      

      2. 協(xié)調(diào)者(Coordinator)實(shí)現(xiàn)

      協(xié)調(diào)者負(fù)責(zé)管理所有參與者,驅(qū)動兩階段提交流程。

      import java.util.List;
      
      /**
       * 協(xié)調(diào)者(事務(wù)管理器)
       */
      public class Coordinator {
          private List<Participant> participants;
      
          public Coordinator(List<Participant> participants) {
              this.participants = participants;
          }
      
          /**
           * 執(zhí)行兩階段提交事務(wù)
           * @return true表示事務(wù)成功提交,false表示失敗
           */
          public boolean executeTransaction() {
              System.out.println("===== Phase 1: Prepare =====");
              boolean allPrepared = participants.stream()
                      .allMatch(Participant::prepare);
      
              System.out.println("===== Phase 2: Commit/Rollback =====");
              if (allPrepared) {
                  participants.forEach(Participant::commit);
                  System.out.println("Transaction committed successfully.");
                  return true;
              } else {
                  participants.forEach(Participant::rollback);
                  System.out.println("Transaction rolled back due to failures.");
                  return false;
              }
          }
      }
      

      3. 客戶端測試代碼

      模擬包含兩個參與者的分布式事務(wù)場景。

      import java.util.Arrays;
      
      public class TwoPhaseCommitDemo {
          public static void main(String[] args) {
              // 創(chuàng)建兩個參與者(如數(shù)據(jù)庫DB1和DB2)
              Participant db1 = new Participant("DB1");
              Participant db2 = new Participant("DB2");
      
              // 創(chuàng)建協(xié)調(diào)者并關(guān)聯(lián)參與者
              Coordinator coordinator = new Coordinator(Arrays.asList(db1, db2));
      
              // 執(zhí)行兩階段提交事務(wù)
              boolean success = coordinator.executeTransaction();
      
              // 輸出最終狀態(tài)
              System.out.println("\nFinal Status:");
              System.out.println("DB1 Committed: " + db1.isCommitted());
              System.out.println("DB2 Committed: " + db2.isCommitted());
              System.out.println("Transaction Result: " + (success ? "SUCCESS" : "FAILURE"));
          }
      }
      

      4. 運(yùn)行結(jié)果示例

      成功場景(所有參與者準(zhǔn)備成功)

      ===== Phase 1: Prepare =====
      DB1: Trying to prepare...
      DB1: Prepared successfully.
      DB2: Trying to prepare...
      DB2: Prepared successfully.
      ===== Phase 2: Commit/Rollback =====
      DB1: Committed.
      DB2: Committed.
      Transaction committed successfully.
      
      Final Status:
      DB1 Committed: true
      DB2 Committed: true
      Transaction Result: SUCCESS
      

      失敗場景(某一參與者準(zhǔn)備失敗)

      ===== Phase 1: Prepare =====
      DB1: Trying to prepare...
      DB1: Prepared successfully.
      DB2: Trying to prepare...
      DB2: Prepare failed.
      ===== Phase 2: Commit/Rollback =====
      DB1: Rolled back.
      DB2: No need to rollback.
      Transaction rolled back due to failures.
      
      Final Status:
      DB1 Committed: false
      DB2 Committed: false
      Transaction Result: FAILURE
      

      5. 關(guān)鍵點(diǎn)說明

      1. 階段一(Prepare)

        • 協(xié)調(diào)者詢問所有參與者是否可以提交。
        • 參與者鎖定資源并記錄操作日志。
        • 任一參與者失敗則整個事務(wù)回滾。
      2. 階段二(Commit/Rollback)

        • 若所有參與者準(zhǔn)備成功,協(xié)調(diào)者發(fā)送提交命令。
        • 若任一參與者失敗,協(xié)調(diào)者發(fā)送回滾命令。
      3. 代碼簡化說明

        • 實(shí)際應(yīng)用中需處理網(wǎng)絡(luò)超時、重試和持久化日志。
        • 分布式場景下需使用RPC或HTTP替代本地方法調(diào)用。
        • 生產(chǎn)環(huán)境建議使用成熟的XA協(xié)議實(shí)現(xiàn)(如Atomikos、Narayana)。

      6. 2PC的局限性

      • 同步阻塞:參與者在Prepare階段后需阻塞等待協(xié)調(diào)者指令。
      • 單點(diǎn)故障:協(xié)調(diào)者宕機(jī)可能導(dǎo)致事務(wù)懸掛。
      • 數(shù)據(jù)不一致:協(xié)調(diào)者與參與者在Commit階段同時宕機(jī)時,可能部分提交。

      關(guān)注微信公眾號,查看更多技術(shù)文章。

      image

      posted @ 2025-02-01 14:08  DF-Link  閱讀(522)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲天堂领先自拍视频网| 亚洲有无码中文网| 国产亚洲国产精品二区| 中文字幕乱码人妻二区三区| 国产亚洲精品成人aa片新蒲金| 无码国产玉足脚交极品播放| 日韩幕无线码一区中文| 亚洲色欲在线播放一区二区三区 | 亚洲AV无码东方伊甸园| 中文字幕日韩国产精品| 少妇午夜啪爽嗷嗷叫视频 | 国产深夜福利在线免费观看| 午夜免费福利小电影| 高清自拍亚洲精品二区| 漂亮人妻被强中文字幕久久| 国产日韩另类综合11页| 狠狠色噜噜狠狠狠狠av不卡| 久久国内精品一区二区三区| 国产精品亚洲av三区色| 久久天天躁夜夜躁狠狠85| 亚洲不卡一区二区在线看| 高中女无套中出17p| 欧美性猛交xxxx乱大交极品| 亚洲av永久无码精品水牛影视| 亚洲国产高清aⅴ视频| 久久综合久中文字幕青草| 99www久久综合久久爱com| 亚洲一区二区三区久久综合| 久久久久无码精品国产h动漫| 无码va在线观看| 亚洲女同在线播放一区二区| 免费 黄 色 人成 视频 在 线 | 国产资源精品中文字幕| 加勒比久久综合网天天| 含紧一点h边做边走动免费视频 | 欧美黑吊大战白妞| www国产精品内射熟女| 中文字幕免费不卡二区| 成全高清在线播放电视剧 | jlzz大jlzz大全免费| 亚洲av色在线播放一区|