rails 樂觀鎖

定義:
當我們獲取數據後,可能會有多個人同時修改數據,爲了保證修改數據沒有衝突,所以rails引進了樂觀鎖的概念,當多個人同時修改數據,那麼最先修改的纔會起作用,其他都會失效,如果想要再次修改必須獲得最新的數據。

場景:
樂觀鎖適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,數據發生衝突的可能性就會增大,爲了保證數據的一致性,應用層需要不斷的重新獲取數據。

現在就爲大家演示下樂觀鎖的基本過程:

一、準備
1、下載種子文件並將其導入到數據表中:
在瀏覽器裏打開下面這個網址,下載下來放在rails項目裏的 db目錄下:
點擊這裏下載數據資源
首先我們要腳手架的數據模型:rails generate scaffold Product title:string description:text image_url:string price:decimal

將模型遷移到數據庫中生成對應的數據表:rails db:migrate
在這裏插入圖片描述
再將我們的種子數據導入到生成的數據表中運行:rails db:seed
在這裏插入圖片描述
2、要使用樂觀鎖的表需要有一個lock_versionc的字段,每次更新記錄的時候
create_at會自動增加這個字段的值,我們可以通過rails自帶的生成器創建按這個字段:rails generate migration add_lock_version_to_products lock_version:integer
在這裏插入圖片描述
3、將我們剛纔新添加的字段遷移到數據庫的products表中:rails db:migrate
在這裏插入圖片描述
此時我們可以在db/schema.rb裏查看我們生成的products表的結構:
在這裏插入圖片描述
4、登錄到rails的控制檯:rails console/rails c
在這裏插入圖片描述
5、查看數據表中的所有數據
可以看出所有數據的lock_version的值都爲0
在這裏插入圖片描述
二、實踐
1、假設有user_a和user_b同時獲取了id爲1的數據
在這裏插入圖片描述
2、這個時候如果user_a先修改了id爲1的數據
這裏先將user_a的標題修改成了bruceelee,然後將其保存在數據庫中,可以看到當前的lock_version的值變爲了1.
在這裏插入圖片描述
3、這時如果b同樣去修改對應的標題就會報錯
這裏會提示你試圖去修改一箇舊的數據
在這裏插入圖片描述
4、我們再看看id爲1的數據有沒有更改爲user_b修改的數據
發現此時的數據依然是user_a修改的數據

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章