一 併發控制
1.1讀寫鎖
讀鎖
讀鎖是共享的,或者說是互不阻塞的,多個客戶端可以在同一時刻讀取同一資源,互不干擾。
寫鎖
寫鎖是排他的,一個寫鎖會阻塞其他的寫鎖和讀鎖。
在實際開發過程中mysql每時每刻都發生鎖定,當用戶修改一部分數據是,mysql會進行鎖定,防止其他用戶讀取同一數據。
1.2 鎖粒度
鎖的各種操作 包括 獲得鎖 檢查鎖是否已經解除,釋放等,都會增加開銷,所謂的鎖就是在開銷和數據安全之間進行一個平衡。
表鎖(table lock)
表鎖是mysql中最基本的鎖策略,並且是開銷最小的鎖。當一個用戶進行插入 刪除 更新等 就會獲得寫鎖 會阻塞其他用戶的讀寫操作。
服務器會對alter table 的語句進行表鎖,忽略存儲引擎的鎖機制。
行級鎖(row lock)
行級鎖最大程度的支持併發處理,同時也帶來了最大的系統開銷。InnoDB是支持行級鎖的。
1.3事務
事務就是一個工作單元,有一系列的sql語句,如果其中一個不執行,那個這些語句就都不會執行。
事務的特性
1.原子性:
一個事務是最小單元,所有操作要麼成功,要麼全部回滾。
2.一致性:
數據庫總會從一個一致性狀態到另一個一致性狀態。
3.隔離性:
在一個事務的最終提交前,對其他事務通常是不可見的。
4.持久性:
一旦事務提交,所做的修改就會永久的保存在數據庫中。S
4種隔離級別
1.READ UNCOMMITTED(未提交讀):
在這個級別中,數據的修改即使沒提交,對於其他事務也是可見的,這個級別會導致很多問題,一般很少用。
2.READ COMMITTEND(提交讀):
這個級別的操作,在提交之前,不會被別的事務看見的。
3.REPEATABLE READ(可重複讀):
在同一次事務中,多次讀取同樣的記錄,結果是一樣的。這是mysql的默認級別。
4.SERIALIZABLE(可串行化):
強行串行事務,可能會超時,導致鎖的競爭,一般很少用。
1.4死鎖
死鎖是指兩個或者多個事務在同一個資源上相互佔用,並且請求對方佔用的資源,導致惡性循環。
innodb採用了死鎖檢測機制,能檢測到所得循環依賴,innodb會將持有最少排他鎖的事務進行回滾。
1.5mysql中的事務
1.自動提交
mysql默認採用自動提交(autocommit),就是如果不是顯示的開啓一個事務,每個查詢都會被當做一次事務提交。
innodb支持顯示行級鎖:
select ... lock in share mode;
select ... for update;
1.6 MVCC
innodb的MVCC通過在每行數據後面加兩個隱藏列來實現的。這兩列,一個保存了創建時間,一個保存了過期時間(或者是刪除時間)。當然存儲的不是真正的時間值 而是系統的版本號。沒開啓一個新的事物,系統的版本號會自動遞增。事務開始時的系統版本號會作爲事務的版本號,用來和查詢的每行數據進行比較。
select
a.innodb 只會查找早於當前事務版本的數據行(行的系統版本號,小於或者等於事務的版本號)。
b.innodb 行的刪除版本號要麼未定義,要麼大於當前事務的版本號,保證數據在事務開始之前沒有被刪除。
insert
innodb爲insert的數據保存當前系統的版本號作爲行的版本號。
delete
innodb爲刪除的每一行數據保存當前的系統版本號作爲行的刪除標識
update
innodb 插入一條新的記錄,保存當前的版本號爲行的版本號,同時保存當前系統版本號到原來行作爲刪除標識
這種機制可以保證大部分讀操作可以不用加鎖。
1.7innodb概述
innodb的數據保存在表空間中tablespace,表空間是innodb管理的一個黑盒子。數據和索引單獨存放。
innodb的主鍵是聚簇索引,二級索引必須包含主鍵。
innodb支持數據的熱備份。
1.8myisam
myisam支持壓縮,全文索引等。不支持事務和行級鎖。對於只讀的數據或者表比較小應該採用myisam數據庫。
數據文件存在 .myd 索引文件存在 .myi
mysql數據以緊密型存儲。