資料庫鎖機制

2021-09-11 16:11:11 字數 1483 閱讀 2854

在mysql中有表鎖,讀鎖鎖表,會阻塞其他事務修改表資料。寫鎖鎖表,會阻塞其他事務讀和寫。

innodb引擎又支援行鎖,行鎖分為共享鎖,乙個事務對一行的共享唯讀鎖。排它鎖,乙個事務對一行的排他讀寫鎖。

這兩中型別的鎖共存的問題考慮這個例子:事務a鎖住了表中的一行,讓這一行只能讀,不能寫。之後,事務b申請整個表的寫鎖。如果事務b申請成功,那麼理論上它就能修改表中的任意一行,這與a持有的行鎖是衝突的。資料庫需要避免這種衝突,就是說要讓b的申請被阻塞,直到a釋放了行鎖。

意向鎖也就是為了解決這種衝突而出現的,不過要注意:申請意向鎖的動作是資料庫完成的,就是說,事務a申請一行的行鎖的時候,資料庫會自動先開始申請表的意向鎖,不需要我們程式設計師使用**來申請。

共享鎖

加鎖與解鎖:當乙個事務執行select語句時,資料庫系統會為這個事務分配一把共享鎖,來鎖定被查詢的資料。在預設情況下,資料被讀取後,資料庫系統立即解除共享鎖。例如,當乙個事務執行查詢「select * from accounts」語句時,資料庫系統首先鎖定第一行,讀取之後,解除對第一行的鎖定,然後鎖定第二行。這樣,在乙個事務讀操作過程中,允許其他事務同時更新accounts表中未鎖定的行。

相容性:如果資料資源上放置了共享鎖,還能再放置共享鎖和更新鎖。

併發效能:具有良好的併發效能,當資料被放置共享鎖後,還可以再放置共享鎖或更新鎖。所以併發效能很好

排它鎖

加鎖與解鎖:當乙個事務執行insert、update或delete語句時,資料庫系統會自動對sql語句操縱的資料資源使用獨佔鎖。如果該資料資源已經有其他鎖(任何鎖)存在時,就無法對其再放置獨佔鎖了。

相容性:獨佔鎖不能和其他鎖相容,如果資料資源上已經加了獨佔鎖,就不能再放置其他的鎖了。同樣,如果資料資源上已經放置了其他鎖,那麼也就不能再放置獨佔鎖了。

併發效能:最差。只允許乙個事務訪問鎖定的資料,如果其他事務也需要訪問該資料,就必須等待。

了解了資料的鎖機制,資料庫的隔離級別也就好理解多了。每一種隔離級別滿足不同的資料要求,使用不同程度的鎖。

read uncommitted,讀寫均不使用鎖,資料的一致性最差,也會出現許多邏輯錯誤。

read committed,使用寫鎖,但是讀會出現不一致,不可重複讀。

repeatable read, 使用讀鎖和寫鎖,解決不可重複讀的問題,但會有幻讀。

serializable, 使用事務串形化排程,避免出現因為插入資料沒法加鎖導致的不一致的情況。

我們加了寫鎖,就可以保證不出現髒讀,也就是保證讀的都是提交之後的資料,但是會造成不可重讀,即讀的時候不加鎖,          乙個讀的事務過程中,如果讀取資料兩次,在兩次之間有寫事務修改了資料,將會導致兩次讀取的結果不一致,從而導致邏          輯錯誤

資料庫隔離級別參考部落格:

資料庫鎖機制

這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...

資料庫鎖機制

這段時間由於開發專案,重新學習了資料庫的併發控制和鎖機制。資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否...

資料庫鎖機制

資料庫就是通過鎖機制來解決併發問題的。主要就是兩種鎖,共享鎖和排他鎖 也叫獨佔鎖 在執行select語句的時候需要給操作物件 表或者一些記錄 加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖 乙個物件上可以加n個共享鎖 否則不行。共享鎖通常在執行完select語句之後被釋放,當然...