資料庫中的那些「鎖」

2021-10-06 22:11:09 字數 1845 閱讀 5668

資料庫作為多使用者共享資源,同一時刻會有很多的使用者來訪問這一公共資源。當多個使用者併發訪問的時候,資料庫需要合理的控制資源的訪問規則,來保證資料讀寫的正確性。而鎖就是用來實現這些訪問規則的重要手段。在資料庫中存在各種各樣的鎖。以mysql為例,資料庫中的鎖,大概有如下幾種:根據資料操作的方式,資料庫可以分為讀鎖和寫鎖。

當乙個執行緒或者乙個事務,要對某個「資源」進行寫操作時,首先需要獲取對這個「資源」的寫許可權,為了防止這一時刻其他執行緒同時進行寫操作,而產生資料寫入錯亂的情況,先獲取到寫許可權的執行緒會給對應的「資源」新增寫鎖,寫鎖之間是互斥的,這個互斥的特性,保證了同一時間,只可能有乙個執行緒獲取這這個鎖。其他想要更新這個「資源」的執行緒都會被鎖住,直到擁有該「資源」該執行緒釋放了這個寫鎖。換句話說,也就是每個執行緒只能按照獲取鎖的順序乙個乙個的寫,從而避免了併發場景下出現資料不正確的問題。

寫鎖決定了在併發情況下寫入到資料庫中資料的正確性,防止併發寫的過程中產生資料寫入錯亂等不可預知的情況

當乙個執行緒,要對某個「資源」進行讀操作時,會獲取對這個「資源」的讀許可權,因為讀操作不涉及到「資源」的修改,多個讀操作之間是可以並行,也就是說讀鎖之間不是互斥的。讀寫鎖之間是互斥的,主要為了防止讀取到寫入的中間結果。

根據鎖的作用範圍:可以分為全域性鎖,表鎖,行鎖。

是對整個資料庫例項加鎖,使用方式如下:flush tables with read lock (ftwrl)。主要就是用來在某一段時間內鎖住這個資料庫例項,防止資料方式變動,便於資料的備份。

不過使用全域性鎖會有以下不足:

1.如果對從庫新增了全域性讀鎖,在加鎖期間,不能從主庫同步binlog,導致主從延遲。

2.如果對主庫新增了全域性讀鎖,在加鎖期間,資料庫無法響應任何資料更新。

為了完成完整的資料備份的需求,還有其他更多優秀的方案:在支援事務的innodb中,使用事務就可以完成,在重複讀隔離級別中,在事務開啟後,到事務提交前的時間過程中,看到的檢視都是一致,實現完整的資料備份。因為全域性鎖,影響範圍較大,使用的場景較少。

按照鎖的資源不同表鎖可以分為:鎖資料的表鎖和鎖元資料的元資料鎖。

鎖資料的表鎖:粒度是表級別的,使用表鎖的命令:lock tables t1 read,t2 write.此命令表示:對錶t1加讀鎖,對t2新增寫鎖。執行此命令後,其他執行緒對t1表只能讀,不能寫,對t2錶即不可讀也不可寫。而執行lock命令的執行緒可以對t1表進行讀,不能寫,因為此時其他執行緒可以對t1進行讀,如果當前執行緒進行寫的話,會導致其他執行緒讀到中間結果。執行lock命令的執行緒,對t2錶可讀可寫,因為其他執行緒對t2表不可讀也不可寫,當前執行緒對t2表進行讀寫,也不會產生衝突錯誤。

鎖元資料的表鎖(metadata lock,mdl):mdl的作用是保證資料讀寫的正確性,保障在對資料進行讀寫的過程中,不能對錶結構進行修改,mdl不需要顯示使用,在訪問乙個表的時候,會被自動開啟,當訪問表的事務結束後,mdl會被釋放(在mysql5.6後支援了onlineddl,解除了這一限制)。

粒度相對於表鎖更小的鎖,每次只會影響一行或者多行,防止多個執行緒同時更新同一目標資料行。在innodb中乙個事務可以獲取多個行鎖,只有當整個事務提交之後,該事務中持有的行鎖才會被釋放。如果在事務執行過程中,有其他事務也需要某乙個行鎖,那麼後者就會處於阻塞狀態,只有等前者事務提交後,後者才會從阻塞狀態喚醒並獲取到鎖或者等待超時,返回空的資料集。

行鎖,在需要時(對某個行進行修改操作)會自動獲取,當修改語句執行完畢卻並不會立即釋放,只有當這條語句所在事務提交之後才會釋放整個鎖。所以依照行鎖的這種機制,在乙個事務中,有多個操作時,要將可能會獲取行鎖的更新語句在不影響業務的前提下,放在整個事務中所有操作的最後面,這樣可以使其他事務阻塞時,阻塞的時間更短。

還有經常被提到的悲觀鎖和樂觀鎖,這兩個雖然名字裡帶了鎖,但是並不是真正意義上的鎖,這兩個「鎖」是用來解決​併發問題的一種通用思想或者解決方案。只不過在實現的過程中可能會用到鎖而已。​

聊一聊 MySQL 資料庫中的那些鎖

在軟體開發中,程式在高併發的情況下,為了保證一致性或者說安全性,我們通常都會通過加鎖的方式來解決,在 mysql 資料庫中同樣有這樣的問題,一方面為了最大程度的利用資料庫的併發訪問,另一方面又需要保證每個使用者能以一致的方式讀取和修改資料,就引入了鎖機制。全域性鎖是粒度最大的鎖,基本上也使用不上,就...

資料庫中的鎖

11.5.1 鎖的概念 鎖 lock 是在多使用者環境下對資源訪問的一種限制。機制當對乙個 11.5.1 鎖的概念 鎖 lock 是在多使用者環境下對資源訪問的一種限制。機制當對乙個資料來源加鎖後,此資料來源就有了一定的訪問限制。我們就稱對此資料來源進行了 鎖定 在sql server中,可以對以下...

資料庫中的鎖

資料庫 sql server delete 儲存database manager 11.5.1 鎖的概念 鎖 lock 是在多使用者環境下對資源訪問的一種限制。機制當對乙個 11.5.1 鎖的概念 鎖 lock 是在多使用者環境下對資源訪問的一種限制。機制當對乙個資料來源加鎖後,此資料來源就有了一定...