資料庫筆記2 鎖

2022-10-08 22:51:32 字數 1072 閱讀 3852

1、 互斥鎖

當有乙個執行緒要訪問共享資源(臨界資源)之前,會對執行緒訪問的這段**(臨界區)進行加鎖。如果在加鎖之後沒釋放鎖之前其他執行緒要對臨界資源進行訪問,則這些執行緒會被阻塞睡眠,直到解鎖,如果解鎖時有乙個或者多個執行緒阻塞,那麼這些鎖上的執行緒就會變成就緒狀態,然後第乙個變為就緒狀態的執行緒就會獲取資源的使用權,並且再次加鎖,其他執行緒繼續阻塞等待。

2、 讀寫鎖

也叫做共享互斥鎖,讀模式共享,寫模式互斥。有點像資料庫負載均衡的讀寫分離模式。它有三種模式:讀加鎖狀態,寫加鎖狀態和不加鎖狀態。簡單來說就是只有乙個執行緒可以占有寫模式的讀寫鎖,但是可以有多個執行緒占用讀模式的讀寫鎖。

當寫加鎖的模式下,任何執行緒對其進行加鎖操作都會被阻塞,直到解鎖。

當在讀加鎖的模式下,任何執行緒都可以對其進行讀加鎖的操作,但所有試圖進行寫加鎖操作的執行緒都會被阻塞。直到所有讀執行緒解鎖。但是當讀執行緒太多時,寫執行緒一直被阻塞顯然是不對的,所以乙個執行緒想要對其進行寫加鎖時,就會阻塞讀加鎖,先讓寫加鎖執行緒加鎖

3、 自旋鎖

自旋鎖和互斥鎖很像,唯一不同的是自旋鎖訪問加鎖資源時,會一直迴圈的檢視是否釋放鎖。這樣要比互斥鎖效率高很多,但是仍然需要占用cpu。所以自旋鎖適用於多核的cpu。但是還有乙個問題是當自旋鎖遞迴呼叫的時候會造成死鎖現象。所以慎重使用自旋鎖。

4、 樂觀鎖

這其實是一種思想,當執行緒去拿資料的時候,認為別的執行緒不會修改資料,就不上鎖,但是在更新資料的時候會通過版本來判斷其他執行緒是否修改了該資料。,如果資料被修改了就拒絕更新,之所以叫樂觀鎖是因為並沒有加鎖。

5、 悲觀鎖

當執行緒去拿資料的時候,總假設別的執行緒會去修改資料,所以它每次拿資料的時候都會上鎖,別的執行緒去拿資料的時候就會阻塞。

這兩種鎖一般用於資料庫,當乙個資料庫的讀操作遠遠大於寫的操作次數時,使用樂觀鎖會加大資料庫的吞吐量。

6、 死鎖解決方案:程式中事務中對錶的使用盡量按照相同順序來、建立索引避免全表掃瞄,同乙個事務中盡量對所需要的資源一次性鎖定

7、 防止訂單超賣:直接使用update語句,不要先讀再減。

update tb_goods set stock=stock-buy_num where good_id=1 and stock>=buy_num

資料庫(2)資料庫鎖

這一段時間一直在學習關係型資料庫,準備寫乙個小專題來總結一下這一段時間的學習結果。二.事物隔離等級和鎖的關係 網上很多部落格都是直接說了一連串的鎖,什麼悲觀鎖樂觀鎖,什麼讀寫鎖,什麼排他鎖共享鎖。說的不僅語焉不詳,而且分類紊亂,希望看到這篇文章能幫助你理清思路。從鎖的實現方式來看,鎖可以分為悲觀鎖和...

資料庫鎖 學習筆記

資料庫鎖的分類 1 按鎖的粒度劃分 分為表級鎖 行級鎖 頁級鎖 2 按照鎖級別劃分 分為共享鎖 排它鎖 3 按照加鎖方式劃分 分為隱式鎖 內部自動加鎖 顯示鎖 顯示的新增鎖 4 按照使用方式劃分 分為樂觀鎖悲觀鎖 資料庫中不同的儲存引擎支援不同的鎖機制 1 表級鎖 開銷小,加鎖快 不會出現死鎖,發生...

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

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