低併發下的加鎖問題

2021-10-07 20:21:37 字數 549 閱讀 1157

高併發下已有很多解決方案,說一說現公司在併發沒太高的實際場景下是怎樣控制併發問題的。

首先,採用樂觀鎖的思想,在校驗時間戳或版本中選擇了時間戳,基本思想是:每次更新資料都會更新時間戳為當前系統時間,在更新資料前先將本地時間戳與資料庫裡存的時間戳對比一下,若時間戳一樣則證明沒人改過,可以進行更新操作,否則不允許更新。從資料庫獲取資料時會獲取到資料的時間戳t1,更新資料時,更新操作分為三步:1、重新查詢資料庫中的要更新的資料的時間戳t;2、比較t1和t,若相等則繼續步驟3,若不相等則說明有別的事務已更新該資料,直接返回更新失敗;3、更新資料庫。

考慮這樣的情況:如果有兩個事務a和b同時去更新同一條資料,它們從資料庫讀取的都是t1,事務a執行到第二步的時候自然時校驗通過,但此時在它還沒執行第三步的時候事務b也執行到此處,那麼事務b也將會校驗時間戳通過,後果就是不知道資料庫最終詩句是a的還是b的了。解決辦法是將步驟1 2 3當成乙個原子,執行1之前加鎖,執行3後再釋放鎖,這樣事務b在執行步驟1的時候得等待事務a鎖的釋放,然後查出的時間戳必然不等於t1,校驗會失敗。這裡的加鎖可以簡單用map就能實現,將資料主鍵put進去,釋放時將其remove即可。

高併發下的redis加鎖的幾種實現方式

redis加鎖分類 redis能用的的加鎖命令分表是incr setnx set 第一種鎖命令incr 這種加鎖的思路是,key 不存在,那麼 key 的值會先被初始化為 0 然後再執行 incr 操作進行加一。然後其它使用者在執行 incr 操作進行加一時,如果返回的數大於 1 說明這個鎖正在被使...

高併發下快取失效問題

快取穿透 指查詢乙個一定不存在的資料,由於快取是不命中,將去查詢資料庫,但是資料庫也無此記錄,我們沒有將這次查詢的null寫入快取,這將導致這個不存在的資料每次請求都要到儲存層去查詢,失去了快取的意義 風險 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰 解決 null結果快取,並加入短...

高併發下快取失效問題

1.快取穿透 查詢乙個一定不存在的資料,由於快取一定不命中,將查詢資料庫,並且沒有將null寫入快取,這將導致這個不存在的資料每次請求都到儲存層查詢。風險 利用不存在的資料進行攻擊,資料庫瞬時壓力增大,最終導致崩潰。解決方案 null結果快取,並加入短暫過期時間。2.快取雪崩 指設定快取時key採用...