資料庫的樂觀鎖和悲觀鎖

2021-10-06 00:17:31 字數 1410 閱讀 1446

悲觀鎖:假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作,假設資料肯定會衝突,所以在資料開始讀取的時候就把資料鎖定住。【資料鎖定:資料將暫時不會得到修改】

樂觀鎖:假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓使用者返回錯誤的資訊。讓使用者決定如何去做。

1.樂觀鎖是一種思想,實際實現中,表中有乙個版本字段,首先要先獲取到要更新的行的版本字段,當需要對某行或某幾行更新時,檢視該字段與第一次獲取的是否相等,一樣則更新,否則拒絕更新

之所以叫樂觀,因為這個模式沒有資料庫加鎖

樂觀鎖的優點是程式實現,不會存在死鎖問題,阻止不了除了程式之外的資料庫操作

2.悲觀鎖是讀取的時候為後面的更新加鎖,之後再來的讀操作會等待,是資料庫鎖。

悲觀鎖是資料庫實現,能夠組織一切資料庫操作

總的來說:樂觀鎖就是,如果你對資料庫進行更新,別人在這期間進行了更新,則版本號變了,你的更新會進行檢查版本號是否一致,顯然這時候不一致,所以更新被拒絕,可以進行重新操作;

悲觀鎖則會等待前乙個更新完成,才允許你更新。這些都是在併發訪問的情況下會出現的情況

樂觀鎖

具體可通過給表加乙個版本號或時間戳字段實現,當讀取資料時,將version欄位的值一同讀出,資料每更新一次,對此version值加一。當我們提交更新的時候,判斷當前版本資訊與第一次取出來的版本值大小,如果資料庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期資料,拒絕更新,讓使用者重新操作。

悲觀鎖相對比較謹慎,設想現實情況應該很容易就發生衝突,所以我還是獨佔資料資源吧。    

樂觀鎖就想得開而且非常聰明,應該是不會有什麼衝突的,我對錶使用乙個時間戳或者版本號,每次讀、更新操作都對這個字段進行比對,如果在我之前已經有人對資料進行更新了,那就讓它更新,大不了我再讀一次或者再更新一次。    

樂觀鎖的管理跟svn管理**版本的原理很像,如果在我提交**之前用本地**的版本號與伺服器做對比,如果本地版本號小於伺服器上最新版本號,則提交失敗,產生衝突**,讓使用者決定選擇哪個版本繼續使用。    

在實際生產環境裡邊,如果併發量不大且不允許髒讀,可以使用悲觀鎖;但如果系統的併發非常大的話,悲觀鎖定會帶來非常大的效能問題,所以我們就要選擇樂觀鎖定的方法        

另外,mysql在處理併發訪問資料上,還有新增讀鎖(共享鎖)寫鎖(排它鎖)控制鎖粒度【表鎖(table lock)、行級鎖(row lock)】等實現

資料庫 (2)樂觀鎖和悲觀鎖

併發控制手段 樂觀鎖 樂觀併發控制 悲觀鎖 悲觀併發控制 悲觀鎖 當我們要對乙個資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是對該資料進行加鎖以防止併發。這種借助資料庫鎖機制在修改資料之前先鎖定,再修改的方式稱之為悲觀併發控制。悲觀併發控制實際上是 先取鎖再訪問的保守策略...

資料庫鎖 樂觀鎖 悲觀鎖理解

參考 mysql innodb中,樂觀鎖 悲觀鎖 共享鎖 排它鎖 行鎖 表鎖 死鎖概念的理解 樂觀鎖最簡單的實現就是在表中加乙個版本號欄位如version,每次新增設定為1,更新的時候檢查版本號是否一致,如果不一致就更新失敗。版本一致才能更新,然後將版本號 1。首先資料庫需要關閉自動提交功能,或者說...

資料庫之樂觀鎖,悲觀鎖

樂觀鎖 1.只在提交操作時檢查是否違反資料完整性。使用自增長的整數表示資料版本號。更新時檢查版本號是否一致,比如資料庫中資料版本為6,更新提交時version 6 1,使用該version值 7 與資料庫version 1 7 作比較,如果相等,則可以更新,如果不等則有可能其他程式已更新該記錄,所以...