這邊文章主要是總結一些比較好的文章對於數據庫鎖機制及原理的分析。
數據庫鎖:
首先引用一張其他博主的圖:
下面我就針對這圖中的鎖逐一進行一下解釋:
悲觀鎖:
數據庫總是認為多個數據庫並發操作會發生沖突,所以總是要求加鎖操作。悲觀鎖主要表鎖、行鎖、頁鎖。
樂觀鎖:
數據庫總是認為多個數據庫並發操作不會發生沖突,所以總是不加鎖操作。所以在數據進行提交更新的時候,才會正式對數據的沖突與否進行檢測,如果發現沖突了,則讓返回用戶錯誤的信 息,讓用戶決定如何去做。樂觀鎖的實現方式一般包括使用版本號和時間戳。
表級鎖:
讀鎖鎖表,會阻礙其他事務修改表數據。寫鎖鎖表會阻礙其他事務讀與寫。
頁級鎖:
就是對頁加鎖
行級鎖:
行鎖分為共享鎖和排他鎖,共享鎖:一個事務對一行的共享只讀鎖。排它鎖:一個事務對一行的排他讀寫鎖。
共享鎖:
加鎖與解鎖:當一個事務執行select語句時,數據庫系統會為這個事務分配一把共享鎖,來鎖定被查詢的數據。在默認情況下,數據被讀取后,數據庫系統立即解除共享鎖。例如,當一個事務 執行查詢“SELECT * FROM accounts”語句時,數據庫系統首先鎖定第一行,讀取之后,解除對第一行的鎖定,然后鎖定第二行。這樣,在一個事務讀操作過程中,允許其他事務同時更新 accounts表中未鎖定的行。
兼容性:如果數據資源上放置了共享鎖,還能再放置共享鎖和更新鎖。
並發性能:具有良好的並發性能,當數據被放置共享鎖后,還可以再放置共享鎖或更新鎖。所以並發性能很好。
排它鎖:
加鎖與解鎖:當一個事務執行insert、update或delete語句時,數據庫系統會自動對SQL語句操縱的數據資源使用獨占鎖。如果該數據資源已經有其他鎖(任何鎖)存在時,就無法對其再放置 獨占鎖了。
兼容性:獨占鎖不能和其他鎖兼容,如果數據資源上已經加了獨占鎖,就不能再放置其他的鎖了。同樣,如果數據資源上已經放置了其他鎖,那么也就不能再放置獨占鎖了。
並發性能:最差。只允許一個事務訪問鎖定的數據,如果其他事務也需要訪問該數據,就必須等待。
更新鎖:
加鎖與解鎖:當一個事務執行update語句時,數據庫系統會先為事務分配一把更新鎖。當讀取數據完畢,執行更新操作時,會把更新鎖升級為獨占鎖。
兼容性:更新鎖與共享鎖是兼容的,也就是說,一個資源可以同時放置更新鎖和共享鎖,但是最多放置一把更新鎖。這樣,當多個事務更新相同的數據時,只有一個事務能獲得更新鎖,然后 再把更新鎖升級為獨占鎖,其他事務必須等到前一個事務結束后,才能獲取得更新鎖,這就避免了死鎖。
並發性能:允許多個事務同時讀鎖定的資源,但不允許其他事務修改它。
意向鎖(意向共享,意向更新):
在判斷每一行是否已經被行鎖鎖定效率比較低下,因此使用意向鎖,當發現表上有意向共享鎖,說明表中有些行被共享行鎖鎖住了,因此,事務B申請表的寫鎖會被阻塞。