資料庫設計之悲觀鎖和樂觀鎖解析

2021-10-22 08:54:47 字數 756 閱讀 4622

悲觀鎖和樂觀鎖實際上說的並不是具體的一種鎖,而是一種處理的邏輯。

悲觀鎖(pessimistic lock):

悲觀鎖顧名思義,就是假設事情往不好的方向發展,即我們認為每次我們獲取到資料之後,資料大概率會被修改;因此我們在拿到資料之後就給資料加鎖,防止資料被其他執行緒修改了,加鎖期間,其他對該資料進行讀寫的執行緒需要等待鎖的釋放。

樂觀鎖(optimistic lock):

悲觀鎖顧名思義,就是假設事情往好的方向發展,即我們認為我們獲取資料時,資料不會被修改,只需要等要提交更新的資料時,再去判斷資料是否有被修改過。如果沒有,則提交資料,如果有,則回滾操作。

示例:

悲觀鎖:

我們直接呼叫資料庫的相關語句,如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖。

樂觀鎖:

新增乙個字段(如:版本號,最近更新時間),在更新時判斷該欄位是否與獲取的時候一樣,如果一樣,則提交資料和該字段的新值,否則取消操作。

適用場景:

悲觀鎖:比較適合寫入操作比較頻繁的場景,可以保證資料的一致性,如果出現大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。

樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新獲取資料,這樣會增加大量的查詢操作,降低了系統的吞吐量。

總的來說,讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。

資料庫悲觀鎖和樂觀鎖簡述

鎖 locking 業務邏輯的實現過程中,往往需要保證資料訪問的排他性。如在金融系統的日終結算 處理中,我們希望針對某個 cut off 時間點的資料進行處理,而不希望在結算進行過程中 可能是幾秒種,也可能是幾個小時 資料再發生變化。此時,我們就需要通過一些機 制來保證這些資料在某個操作過程中不會被...

資料庫的悲觀鎖和樂觀鎖

資料庫的四種隔離級別 髒讀 不可重複讀 可重複讀 序列化,雖然四種隔離級別能夠處理事務問題,但是不夠靈活,於是有了悲觀鎖和樂觀鎖。悲觀鎖 對於外界的修改持保守態度,在整個資料處理中資料處於鎖定狀態。以mysql為例,select for update和lock in share model能夠實現悲...

資料庫的悲觀鎖和樂觀鎖

悲觀鎖就是對資料的衝突持悲觀態度,也就是假設資料肯定會發生衝突,所以在資料開始讀取的時候就把資料鎖定住。書籍表book,id為商品id 主鍵 isonline是否上線,1代表上線,0代表下線,那麼我們如果要對書籍進行下線,就需要將online置為0,假設id為1 如果不採用鎖 1 select fr...