首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Ruby on Rails 開發實戰(五十一):ActiveRecord 基礎 - 並發處理與樂觀鎖

     編輯:Java 相關知識

多使用者同時存取同一筆資料時,若無協調機制,後寫入者會覆蓋先寫入者的修改(Lost Update)。Rails 採用樂觀鎖解決此問題。

悲觀鎖 vs 樂觀鎖

  • 悲觀鎖:資料庫層面鎖定列/表,阻塞其他存取。Web 應用並發高、連線無狀態,不適用。
  • 樂觀鎖:不鎖定資料,更新前檢查版本號。版本匹配才允許寫入,否則拋出異常。

Rails 樂觀鎖實作

資料表加入 lock_version 整數欄位(預設 0),每次更新自動遞增。ActiveRecord 更新時比對模型與資料庫版本號,不符則拋出 ActiveRecord::StaleObjectError。

create table counters (
  id int not null auto_increment,
  count int default 0,
  lock_version int default 0,
  primary key (id)
);
class Counter < ActiveRecord::Base; end

Counter.delete_all
Counter.create(:count => 0)

count1 = Counter.find(:first)
count2 = Counter.find(:first)

count1.count += 3
count1.save  # 成功,lock_version 變 1

count2.count += 4
count2.save  # 拋出 StaleObjectError,count2 修改被放棄

異常處理與停用

應用程式需 rescue 處理衝突(如重試、提示使用者重新編輯)。若不需樂觀鎖,可全域停用:

ActiveRecord::Base.lock_optimistically = false

延伸閱讀

Martin Fowler 《企業應用架構模式》中關於「樂觀離線鎖」與「工作單元」模式的章節,有助於深入理解並發控制原理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved