高性能mysql筆記(一)併發 事務 引擎

一 併發控制

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數據以緊密型存儲。
發佈了105 篇原創文章 · 獲贊 30 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章