標籤:enc 檢查 str 多個 version 兩種 取數 系統效能 持久
第1章 MySQL架構與曆史1.2 並發控制
MySQL在兩個層面實現並發控制:伺服器層與儲存引擎層。
讀鎖和寫鎖:
在處理並發讀或寫時,可以通過實現一個由兩種鎖組成的系統來解決問題。
這兩種鎖通常被稱為共用鎖定和獨佔鎖定,或者稱為讀鎖和寫鎖。
讀鎖:是共用的,或者說是相互不阻塞的,多個客戶可以在同時讀取同一資料。
寫鎖:是排他的,一個寫鎖會阻塞其他的寫鎖和讀鎖,同一時刻只能有一個使用者能夠寫入,並防止其他使用者讀取正在寫入的資料。
鎖粒度:
鎖粒度:指加鎖的對象的大小。顯然,鎖的粒度越小,並發控制效率越高。
鎖的各種操作,包括獲得鎖、檢查鎖和釋放鎖等,都會增加系統開銷。
因此,如果系統花費大量時間來管理鎖,而不是用來擷取資料,就會影響系統效能。
鎖策略:在鎖的開銷和安全性之間尋求平衡。
有兩種常見的鎖策略,表鎖和行級鎖。
表鎖:開銷較小,但是並發控制不好。
行級鎖:可以很好地實現並發控制,但是開銷比較大。
行級鎖是在 mysql 的儲存引擎層實現,沒有在伺服器層實現,innodb 中實現了行級鎖。
1.3 事務
事務:是一組原子性的SQL語句,事務內的語句,要麼全部執行成功,要麼全部執行失敗。
事務的四大特性ACID:
原子性:整個事務要麼全部提交成功,要麼全部失敗復原,不可以只執行一部分。
一致性:資料庫總是從一個一致狀態轉換到另一個一致狀態。(轉賬失敗後,卡裡的錢應該不變,不能少了)
隔離性:事務提交之前所做的修改對其他事務是不可見的。(通常來說)
持久性:事務提交之後,所做的修改會持久化到資料庫中。
交易處理也會使系統做更多額外工作,使用者可以根據業務是否需要進行交易處理,選擇合適的儲存引擎。
四種事務的隔離等級:
READ UNCOMMITTED (未提交讀):
事務中的修改,即使沒提交,對其他事務也是可見的。
事務可以讀取未提交的資料,也叫髒讀,一般很少使用。
READ COMITTED (提交讀):
一個事務開始時,只能看見已經提交的修改,並且所做的修改對其他事務不可見。
這個層級有時候也叫不可重複讀取,因為兩次執行同樣的查詢,可能會得到不同的結果。
事務A前後執行兩次查詢,前一次讀取某條記錄之後,事務B對其進行了修改並提交,這時當A再次讀取該資料的時候就會發現與之前讀取的結果不一樣。
是大多數資料庫預設的隔離等級(但MySQL不是)。
REPEATABLE READ (可重複讀):
保證了同一個事務多次讀取同樣記錄的結果是一致的。但無法解決幻讀。
幻讀:事務A讀取某個範圍內的記錄時,事務B又在該範圍插入入新的記錄,當事務A再次讀取時,會產生幻行。
另一種幻讀情況:事務A對資料庫所有行做了修改時,事務B對向資料庫中插入了一行新的資料。這時A發現還有沒有修改的記錄,就像發生幻覺一樣。
InnoDB儲存引擎通過多版本並發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。
這是MySQL (InnoDB引擎)的預設交易隔離等級。
SERIALIZABLE (可序列化):
強制事務串列執行,在讀取每行資料上都加鎖,可能產生大量的逾時和鎖爭用問題。
只有在非常需要確保資料的一致性,且可以接受沒有並發的情況下才考慮使用該層級。
《高效能MySQL》學習筆記