MySQL常用基礎概念(二)

MySQL常用基礎概念(二)

大家好,我是夢辛工作室的靈,最近我在閱讀一本高性能MySQL的書,對我有很大的啓發,後面會不斷的對有用的內容做一個摘要,當然也是爲了鞏固自己的學習內容,有興趣的同學可以去京東購買該書,對MySQL理解可以讓我們更深的理解並操作它(高性能MySQL第三版)

1.3.3 事務日誌
事務日誌可以幫助提高事務的效率。使用事務日誌,存儲引擎在修改表的數據時只需要修改其內存拷貝,再把該修改行爲記錄到持久在硬盤的事務日誌中,而不用每次都將修改的數據本身持久化到磁盤

1.3.4 MySQL中的事務
MySQL提供了兩種事務型的存儲引擎: InnoDB 和 NDB Cluster。

自動提交(AUTOCOMMIT)
MySQL默認採用自動提交(AUTOCOMMIT)模式。也就是說如果不是顯示的開始一個事務,則每個查詢都被當做一個事務執行提交操作,在當前連接中,可以通過AUTOCOMMIT變量來啓用或禁用自動提交模式;

也可查看當前提交模式 SHOW VARIABLES LIKE ‘AUTOCOMMIT’;

1或者ON標識啓用, 0 或者OFF標識禁用。
當AUTOCOMMIT=0時,所有的查詢都是在一個事務中,直到顯示的執行COMMIT提交或者ROLLBACK回滾,該事務結束,同時有開始了一個新的事務。修改AUTOCOMMIT對非事務型的表,比如MyISAM或者內存表,不會有任何影響,對這類表來說,沒有COMMIT或者ROLLBACK的概念,也可以說是一直處於AUTOCOMMIT啓用的模式

在事務中混合使用存儲引擎
如果在事務中混合使用了事務型和非事務型的表(例如InnoDB和MyISAM表),在正常的提交情況下不會有什麼問題
但如果事務需要回滾,非事務型表上的變更就無法撤銷,這會導致數據庫處於不一致的狀態,這種情況很難修復,事務的最終結果無法確定
在非事務的表上執行事務相關的操作時,MySQL通常不會發出提醒,也不會報錯,有時候只有回滾的時候纔會發出一個警告

隱式和顯式鎖定
InnoDB採用的是兩階段鎖定協議,在事務執行過程中,所示都可以執行鎖定,鎖只有在執行COMMIT或ROLLBACK的時候纔會釋放,並且所有的鎖都是在同一時刻被釋放,這種鎖定是隱式鎖定,InnoDB會根據隔離級別在需要的時候自動加鎖
另外,InnoDB也支持通過特定的語句進行顯示鎖定,這些語句不屬於SQL規範:
select *** lock In Share mode
select *** for update

1.4多版本併發控制
MySQL的大多數事務型存儲引擎實現的都不是簡單的行級鎖,基於提升併發性能的考慮。他們一般都同時實現了多版本併發控制(MVCC)。
MVCC的實現是通過保存數據在某個時間點的快照來實現的,也就是說,不管需要執行多長時間,每個事務看到的數據都是一致的,根據事務開始的時間不同,每個事務對同一張,同一時刻的數據可能是不一樣的。
不同的存儲引擎的MVCC實現也是不同的,典型的有樂觀併發控制和悲觀併發控制。
InnoDB的MVCC是通過在每行記錄後面保存兩個隱藏的列來實現的,這兩個列一個保存了行的創建時間,一個保存了行的過期時間(或刪除時間),當然存儲的並不是實際的時間值,而是系統版本號,沒開始一個新的事務,系統版本號都是自動遞增,事務開始時刻的系統版本號作爲事務的版本號,用來查詢到的每行記錄的版本號來進行比較。下面看一下在REPEATABLE READ 隔離級別下,MVCC具體如何操作的;
SELECT
InnoDB會根據以下兩個條件檢查每行記錄:
a.InnoDB只查找版本早於當前事務版本的數據行,這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的,
b.行的刪除版本要麼未定義,要麼大於當前事務版本號,這樣可以確保事務讀取到的行,在事務開始之前未被刪除。
只有滿足以上兩個條件的記錄,才能作爲查詢結果
INSERT
InnoDB爲每新插入的每一行保存當前系統版本號作爲行版本號;
DELETE
InnoDB爲刪除的每一行保存當前系統版本號作爲刪除標識;
UPDATE
InnoDB爲插入一行新記錄,保存當前系統版本號作爲行版本號,同時保存當前系統的版本號到原來的行作爲刪除標識。

保存這兩個額外的系統版本號,是大多數讀操作都可以不用加鎖,這樣設計使得讀數據操作很簡單,性能很哈,並且也能保證只會讀取到符合標準的行,不足之處是每行記錄都需要額外的存儲空間,沒要跟多的行檢查工作以及一些額外的維護工作。

MVCC只在REPEATABLE READ 和 READ COMMITED 兩個隔離級別下工作,其他兩個隔離級別都和MVCC不兼容,因爲READ UNCOMMITED總是讀到最新的數據行,而不是符合當前事務版本的數據行,而SERIALIZABLE會對所有的行都加鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章