樂觀鎖與悲觀鎖的理解

2021-10-02 21:51:04 字數 928 閱讀 5885

不管是悲觀鎖還是樂觀鎖,主要作用就是對共享資源上鎖,防止多執行緒訪問產生的執行緒安全問題。

鎖處理的是修改資料問題/更新資料問題

悲觀鎖:假設資料修改一定會出現執行緒安全問題,訪問時申請對資源的鎖,其他使用者只能阻塞等待。

樂觀鎖:假設資料修改一般不會出現衝突,只有在資料提交的時候才會對資料衝突與否進行檢查,若衝突進行相應處理。但是樂觀鎖不能解決髒讀的問題。

多使用者環境中,會出現多個使用者更新相同記錄的情況。

典型的衝突有:

丟失更新:乙個事務的更新覆蓋了其他事務的更新。

比如使用者a把值從6改到2,另乙個使用者把值從2改到6

髒讀:乙個事務讀取其他完成一半事務的記錄時,就會出現髒讀。

使用者ab看到的值時6,使用者a更新值為2沒提交,但使用者b看到的任然是6

為了解決這些併發帶來的問題,我們需要引入併發同步機制通過資料庫表增加乙個version欄位,讀資料時連version一同讀出,寫資料時將version欄位的值增加一。當我們提交更新的時候,判斷資料庫對應記錄的版本號與讀出的版本號是否一致,若不一致,說明讀到過期資料

新增version欄位 table=

讀取version欄位:select version from table where id=「1」

每次更新table表時,執行這樣的sql: update table set value=#newvalue,version=version+1 where version=versionvalue and id=「1」

分析:兩使用者都更新記錄id為1的記錄

在同一時刻有兩使用者更新id為1的記錄,若使用者a更新成功,將version從2累加到3,使用者b也更新記錄執行where version=2,最終不執行此記錄。最終實現只有乙個使用者操作記錄。實質是縮短了通過時間,最終還是使得使用者a和使用者b序列操作記錄。

樂觀鎖與悲觀鎖 理解

當我們要對乙個資料庫中的一條資料進行修改的時候,為了避免同時被其他人修改,最好的辦法就是直接對該資料進行加鎖以防止併發,這種借助資料庫鎖機制在修改資料之前先鎖定,再修改的方式被稱之為悲觀併發控制。悲觀鎖,它指的是對資料被外界 包括本系統當前的其他事務,以及來自外部系統的事務處理 修改持保守態度 悲觀...

悲觀鎖與樂觀鎖的理解

悲觀鎖 總是假設發生最壞的情況,就是每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會阻塞直到它拿到鎖 共享資源每次只給乙個執行緒使用,其它執行緒阻塞,用完後再把資源轉讓給其它執行緒 傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖...

深度理解樂觀鎖與悲觀鎖

public int updateentry long id for update id 2 修改記錄內容,根據計算修改entry記錄的屬性 string name generatorname entry entry.setname name 3 update操作 int count update ...