Rails應用程式中同時修改操作衝突問題的解決方案

2022-09-26 05:12:07 字數 1061 閱讀 5994

rails 應用程式中操作衝突是乙個常見問題,rails 提供了簡單程式設計客棧有效的解決方法。

舉乙個實際的例子:我們的系統裡有乙個商店模組,商店中重要的一塊是對產品資訊的管理,比程式設計客棧如運營人員常常會編輯產品的資訊,包括產品標題,營銷口號和**等等。因為修改十分頻繁,碰巧同時編輯提交修改的話,就會偶爾遇到修改丟失的問題,運營人員 a 修改產品標題,運營人員 b 修改**,a 和 b 提交修改都提示修改成功,但是結果上只是 a 的修改結果生效,b 的修改被 a 的修改沖掉了。

仔細研究原因,發現是因為修改功能缺少操作衝突機制,而修改操作同時發生導致了問題。 如下圖所示,a 和 b 同時從資料庫中查詢資料,在 web 頁面中修改同樣的資料,提交儲存時是以 web 頁面中提交的資料為準,從而導致 a 的修改把 b 的修改給覆蓋了。

rails 的 樂觀鎖optimistic locking 是解決這個問題的有力工具,它的原理是在資料庫表中增加乙個字段(預設是 lock_version,可配置)記錄資料的ruuyjec版本號,每個提交的修改都帶上這個版程式設計客棧本號,在真正 update 修改資料之前,先判斷提交的 lock_version 資料和資料庫中的是否一致,如果不一致,則認為發生資料衝突,將丟擲 activerecord::staleobjecterror 異常,這樣程式就可以捕獲這個異常,提醒使用者發生了衝突,由使用者去協調解決衝突。

相關示例**如下所示:

複製** **如下:

# migration: add lock_version to products

add_column :products, :lock_程式設計客棧version, :integer, de****t: 0

# update product with staleobjecterror checking

begin

product.update(params[:product])

rescue activerecord::staleobjecterror

render 'confilct'

end

本文標題: rails應用程式中同時修改操作衝突問題的解決方案

本文位址:

rails應用程式的基本操作(一)

建立rails應用程式 rails new depot生成腳手架 rails g scaffold product title string資料遷移 rake db migrate測試 rake test回滾遷移 rake db rollback檢視檔案內容 建立新的控制器 rails g cont...

Docker化現有的Rails應用程式

docker是乙個相對較新且發展swift的專案,它允許建立非常輕便的 虛擬機器 在計算機上進行所有工具設定可能是一項艱鉅的任務,但值得慶幸的是,隨著docker變得穩定,在您喜歡的os上啟動並執行docker變得非常容易。首先,我們將安裝docker。直到幾個版本之前,在osx和windows上執...

修改應用程式的視窗

修改應用程式視窗的外觀 1 在視窗建立之前修改 我們應該在cmainframe類的precreatewindow成員函式之中進行。precreatewindow是乙個虛函式,我們要重寫他。在precreatewindow函式中修改createstruct這個結構體的成員 結構定義了傳遞給應用程式的視...