定義:
當我們獲取數據後,可能會有多個人同時修改數據,爲了保證修改數據沒有衝突,所以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修改的數據