34、mysql鎖、事務、隔離
連線池 與使用者請求建立連線
核心功能層 查詢解析,分析,優化,內建函式,跨儲存引擎的功能
儲存引擎層 資料的存入和提取
mysql的傳送預設為明文,可以使用ssl加密資料
parser 詞法,語法,語意分析,優化
explain 分析工具
query cache 快取,只儲存select查詢
併發訪問控制:基於鎖來實現
MySQL鎖:
執行操作時施加的鎖的模式
讀鎖:使用者在讀的時候施加的鎖,為防止別人修改,但是使用者可以讀,還被稱為共享鎖
寫鎖:獨佔鎖,排它鎖。其他使用者不能讀,不能寫
鎖粒度:
表鎖:table lock
鎖定了整張表
行鎖:row lock
鎖定了需要的行
粒度越小,開銷越大,但併發性越好:
粒度越大,開銷越小,但並非性越差;
鎖的實現位置:
MySQL鎖 可以手動使用,可以使用顯示鎖
儲存引擎鎖 自動進行的(隱式鎖)
顯示鎖:
LOCK TABLES t1 READ; 施加讀鎖
LOCK TABLES t1 WRITE; 施加寫鎖
UNLOCK TABLES; 解鎖
SHOW OPEN TABLES WHERE In_use > 0; 檢視那些表被鎖定
InnoDB儲存引擎也支援另外一種顯示鎖(鎖定挑選出的部分行,行級鎖)
select .... lock in share mode
select .... for update
SHOW TABLE STATUS LIKE 't1'\G
SELECT * FROM t1 WHERE ID <=3 LOCK IN SHARE MODE;
做備份時要手動施加讀鎖
事務:Transaction
事務就是一組原子性的查詢語句,也即將多個查詢當作一個獨立的工作單元
ACID測試:能夠滿足ACID測試就表示其支援事務,或相容事務
A:Atomicity 原子性,都執行或者都不執行
C:Consistency 一致性,從一個一致性狀態轉到另外一個一致性狀態
I:Isolaction 隔離性。一個事務的所有修改操作在提交前對其他事務時不可見的
D: Durability 永續性,一旦事務得到提交,其所做的修改會永久有效
安全性越高,併發性越低
隔離級別:
READ UNCOMMITTEND (讀未提交),髒讀,不可重複讀,幻讀
READ COMMITTEND (讀提交)
REPEATABLE READ (可重讀)
SERIALIZABLE (可序列化)強制事務的序列執行避免了幻讀;效能極低
START TRANSACTION; 啟動事務( MyISAM不支援事務)
COMMIT; 事務提交
ROLLBACK 事務回滾(全部回滾)
SAVEPOINT identifier 建立回滾點
ROLLBACK TO identifier 事務回滾(回滾到某個點)
mysql事務預設自動提交,對手動顯示啟動事務不會影響。
如何沒有顯式啟動事務,每個語句都會當作一個預設的事務,其執行完成會被自動提交
可通過如下方式關閉自動提交。
SHOW GLOBAL VARIABLES LIKE '%commit%';
select @@global.autocommit
set global autocommit = 0
注意 關閉自動提交,請記得手動啟動事務,應記得手動提交
檢視mysql的事務隔離級別
show global variables like '%iso%'
select @@global.tx_isolation
建議:對事物要求不特別嚴格的場景下,可以使用讀提交
MVCC:多版本併發控制
每個事務啟動時,InnoDB會為每個啟動的事務提供一個當下時刻的快照
為實現此功能,InnoDB會為每個表提供兩隱藏的欄位,一個用於儲存行的建立時間,一個用於儲存行的失效時間
裡面儲存的系統版本號
MVCC只在兩個隔離級別下有效:read committed和repeatable read