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

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

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

      為什么where=Version就是樂觀鎖了?

      先看一段代碼,為什么下面這個代碼就是樂觀鎖了?

         // 樂觀鎖更新:使用最新的version
                      LambdaUpdateWrapper<DistributeEvent> upd = new LambdaUpdateWrapper<>();
                      upd.eq(DistributeEvent::getId, currentEvent.getId())
                              .eq(DistributeEvent::getVersion, currentEvent.getVersion())
                              .set(DistributeEvent::getNodeAddress, targetAddress)
                              .set(DistributeEvent::getVersion, currentEvent.getVersion() + 1)
                              .set(DistributeEvent::getModifierTime, java.time.LocalDateTime.now());
      

      ?? 什么是樂觀鎖?

      樂觀鎖是一種并發控制機制,它假設多個事務同時訪問數據時沖突的概率很低,所以不會在讀取數據時加鎖,而是在更新時檢查數據是否被其他事務修改過

      ?? 樂觀鎖的核心原理

      樂觀鎖的核心思想是:"我讀取數據時記住一個版本號,更新時檢查版本號是否還是原來的,如果不是說明被別人改過了"

      ?? 通過具體例子理解

      場景:兩個節點同時想處理同一個事件

      // 初始數據庫狀態
      // id=123, status='PENDING', version=1, node_address=null
      
      // === 時刻1:節點A和節點B同時讀取 ===
      // 節點A讀取:{id=123, status='PENDING', version=1, node_address=null}
      // 節點B讀取:{id=123, status='PENDING', version=1, node_address=null}
      

      傳統方式(沒有樂觀鎖)會出現什么問題?

      -- 節點A執行:
      UPDATE distribute_event 
      SET status='PROCESSING', node_address='192.168.1.10:8080' 
      WHERE id=123 AND status='PENDING';
      -- 影響行數:1 ? 成功
      
      -- 節點B執行:
      UPDATE distribute_event 
      SET status='PROCESSING', node_address='192.168.1.11:8080' 
      WHERE id=123 AND status='PENDING';
      -- 影響行數:0 ? 失敗,但節點B不知道為什么失敗
      

      問題:節點B不知道是因為沒有數據還是因為并發沖突導致的失敗。

      使用樂觀鎖的方式

      -- 節點A執行:
      UPDATE distribute_event 
      SET status='PROCESSING', 
          node_address='192.168.1.10:8080',
          version = version + 1  -- 版本號遞增!
      WHERE id=123 AND version=1;  -- 檢查版本號!
      -- 影響行數:1 ? 成功,數據變成 {id=123, version=2, ...}
      
      -- 節點B執行:
      UPDATE distribute_event 
      SET status='PROCESSING', 
          node_address='192.168.1.11:8080',
          version = version + 1
      WHERE id=123 AND version=1;  -- 還在用舊版本號!
      -- 影響行數:0 ? 失敗,因為現在version已經是2了
      

      優勢:節點B知道這是因為并發沖突導致的失敗,可以重新讀取數據再試。

      ?? 代碼中的樂觀鎖實現

      1. 版本字段定義

      `version` INT NOT NULL DEFAULT 1 COMMENT '樂觀鎖版本,用于并發控制'
      

      2. 樂觀鎖更新邏輯

      // 代碼中:
      upd.eq(DistributeEvent::getId, evt.getId())
         .eq(DistributeEvent::getVersion, evt.getVersion())  // ?? 關鍵:檢查版本號
         .set(DistributeEvent::getNodeAddress, targetAddress)
         .set(DistributeEvent::getModifierTime, java.time.LocalDateTime.now());
      
      int updated = distributeEventMapper.update(null, upd);
      if (updated > 0) {
          success++;  // ? 更新成功
      } else {
          skipped++;  // ? 版本沖突,跳過
      }
      

      這段代碼轉換成SQL就是:

      UPDATE distribute_event 
      SET node_address = #{targetAddress}, 
          modifier_time = NOW()
      WHERE id = #{id} AND version = #{version};  -- 同時檢查ID和版本號
      

      ?? 樂觀鎖的完整流程演示

      // === 場景:事件遷移時的并發控制 ===
      
      // 步驟1:讀取數據
      DistributeEvent evt = {id: 123, version: 5, node_address: "offline-node"};
      
      // 步驟2:樂觀鎖更新
      UPDATE distribute_event 
      SET node_address = 'new-node',
          version = 6,           -- 版本號+1
          modifier_time = NOW()
      WHERE id = 123 
        AND version = 5;         -- 必須匹配讀取時的版本號
      
      // 結果分析:
      // - 如果影響行數=1:說明更新成功,沒有并發沖突
      // - 如果影響行數=0:說明version已經不是5了,有其他線程修改過數據
      

      ?? 樂觀鎖 vs 悲觀鎖對比

      特性 樂觀鎖 悲觀鎖
      加鎖時機 更新時檢查 讀取時就加鎖
      并發性能 高(無鎖讀取) 低(串行執行)
      適用場景 沖突少的場景 沖突多的場景
      實現方式 版本號/時間戳 SELECT...FOR UPDATE

      悲觀鎖的例子:

      -- 悲觀鎖:先鎖定再更新
      SELECT * FROM distribute_event WHERE id=123 FOR UPDATE;  -- 加鎖
      UPDATE distribute_event SET node_address='new-node' WHERE id=123;  -- 更新
      -- 事務結束時釋放鎖
      

      樂觀鎖的例子:

      -- 樂觀鎖:讀取時不加鎖,更新時檢查版本
      SELECT * FROM distribute_event WHERE id=123;  -- 無鎖讀取
      UPDATE distribute_event 
      SET node_address='new-node', version=version+1 
      WHERE id=123 AND version=#{原版本號};  -- 更新時檢查版本
      

      ?? 總結

      為什么代碼是樂觀鎖?

      1. 有版本字段version 字段用于記錄數據版本
      2. 更新時檢查版本WHERE version = #{原版本}
      3. 檢查更新結果:通過 updated > 0 判斷是否沖突
      4. 沖突時的處理:跳過沖突的記錄

      這就是典型的樂觀鎖模式:相信數據不會沖突,但在更新時驗證這個假設是否成立!

      posted @ 2025-09-12 09:38  舒一笑不禿頭  閱讀(14)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 白嫩人妻精品一二三四区| 亚洲国产色婷婷久久99精品91| 无码国产偷倩在线播放| 日本无人区一区二区三区| 久久精品国产福利亚洲av| 偷拍美女厕所尿尿嘘嘘小便| 暖暖免费观看电视在线高清| 欧美牲交a欧美牲交aⅴ一| 91精品国产自产在线蜜臀| 亚洲精品一二三四区| 97欧美精品系列一区二区| 免费视频爱爱太爽了| 国产av一区二区午夜福利| 亚洲欧美高清在线精品一区二区| 欧美午夜精品久久久久久浪潮| 伊人色综合九久久天天蜜桃| 中文字幕精品亚洲二区| 亚洲免费观看视频| 亚洲香蕉免费有线视频| 国产欧美综合在线观看第十页| brazzers欧美巨大| 成人免费无遮挡在线播放| 久久精品国产国产精品四凭| 精品一区二区三区波多野结衣| 色悠悠国产在线视频一线| a级黑人大硬长爽猛出猛进| 亚洲人成电影网站色mp4| 熟女人妻aⅴ一区二区三区电影| 亚洲蜜桃av一区二区三区| 一区二区三区四区亚洲自拍| 国产免费丝袜调教视频| 我要看亚洲黄色太黄一级黄| 中文无码乱人伦中文视频在线| 另类 专区 欧美 制服| 久久日韩精品一区二区五区| 國产AV天堂| 亚洲国产日韩a在线亚洲| 欧洲免费一区二区三区视频| 久久99热只有频精品8| 精品国产综合成人亚洲区| 米奇影院888奇米色99在线|