mysql的大多數事務型儲存引擎
實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制(mvcc)。
不僅是mysql,包括oracle, postgresql等其他資料庫系統也都實現了mvcc,但各自的實現機制不盡相同,因為mvcc沒有乙個統一的實現標準。其實現,是通過儲存資料在某個時間點的快照來實現的。即,不管需要執行多長時間,每個事務看到的資料都是一致的。根據事務開始的時間不同,每個事務對同一張表,同一時刻開到的資料可能是不一樣的。可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制所有不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要的行。
下面通過innodb的簡化版行為來說明mvcc是如何工作的。
innodb的mvcc,是通過在每行紀錄後面儲存兩個隱藏的列來實現的。這兩個列,乙個儲存了行的建立時間,乙個儲存了行的過期時間,(儲存的並不是實際的時間值,而是系統版本號)。每開始乙個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行紀錄的版本號進行比較。在repeatable read
隔離級別下,mvcc具體的操作如下:
只有符合上述兩個條件的紀錄,才能作為查詢結果返回。
優點:
儲存這兩個額外系統版本號,使大多數讀操作都可以不用加鎖。這樣設計使得讀資料操作很簡單,效能很好。
缺點:
每行紀錄都需要額外的儲存空間,需要做更多的行檢查工作,以及一些額外的維護工作。
為了實現可序列化,同時避免鎖機制存在的各種問題,我們可以採用基於多版本併發控制(multiversion concurrency control,mvcc)思想的無鎖事務機制。人們一般把基於鎖的併發控制機制稱成為悲觀機制,而把mvcc機制稱為樂觀機制。這是因為鎖機制是一種預防性的,讀會阻塞寫,寫也會阻塞讀,當鎖定粒度較大,時間較長時併發效能就不會太好;而mvcc是一種後驗性的,讀不阻塞寫,寫也不阻塞讀,等到提交的時候才檢驗是否有衝突,由於沒有鎖,所以讀寫不會相互阻塞,從而大大提公升了併發效能。我們可以借用源**版本控制來理解mvcc,每個人都可以自由地閱讀和修改本地的**,相互之間不會阻塞,只在提交的時候版本控制器會檢查衝突,並提示merge。
我們可以簡單的得出這樣的結論:對讀的響應速度和併發性要求比較高的場景適合mvcc;而retry代價越大的場景越適合悲觀鎖機制。參考
[1] 多版本併發控制(mvcc)在分布式系統中的應用
mysql運維 讀書筆記 Mysql 讀書筆記
mysql儲存時間有兩種型別 datetime和timestamp。分別說一下兩者的區別。datetime,以8位元組儲存時間,理論上可以從0000年儲存到9999年。並且沒有時區的概念,它儲存的就是乙個時間點的概念。timestamp和datetime最主要的不同就是,它是以4個位元組儲存,由19...
mysql讀書筆記
鎖 一 表鎖mysql中最基本的鎖策略,是開銷最小的策略。二 表鎖鎖定整張表。使用者在對錶進行寫操作前,需要先獲取寫鎖,阻塞其他使用者對該錶的所有讀寫操作。三 表鎖在沒有寫鎖時,使用者才會獲取讀鎖,讀鎖與寫鎖之間是不相互阻塞的 四 表鎖在特定場景中,表鎖的效能比較良好。五 表鎖寫鎖優先順序要高於讀鎖...
讀書筆記 Mysql 索引
mysql有不同的儲存引擎型別,儲存引擎使用不同的方式將索引存放在磁碟上。不同的存放方式對效能有不同的影響。myisam按照行儲存的物理位置來尋找資料,innodb按照主鍵值引用行。mysql 索引的型別 b tree索引 b tree索引的適用場景 匹配全名,匹配最左字首,匹配列字首,精確匹配一部...