mysql的隔離性和鎖

2022-07-03 17:03:18 字數 1667 閱讀 5213

innodb的事務支援4種隔離機制,分別是 read uncommitted, read committed, repeatable read, and serializable. 其中預設的為repeatable read.

下面詳細分析這4種隔離性的聯絡和區別。

在不用鎖的查詢語句中,此隔離級別保證了每次事務讀取到的資料是一致的。

在用鎖的查詢中(update等),如果查詢是指定索引查詢,那麼只會在鎖住索引中的某個值,如果是指定索引的範圍查詢,那麼會在範圍的間隙加鎖,也就是間隙鎖。

此隔離級別會有重複讀取的問題。

當你在乙個事務中查詢兩次,可能返回的結果不一樣,這是由於在第一次查詢結束後,此隔離級別只會鎖住對應的值和值的間隙,另乙個事務對錶進行了插入了原來不存在的值(也就是沒有被鎖住的值),那麼就會導致兩次查詢的結果不一致。

// 重複讀問題的解釋

比repeatable read弱一級,在指定索引查詢時,如果是範圍查詢那麼不會加間隙鎖,只會鎖住某個值,這就會導致幻讀的問題。

舉例而言:

當你有乙個索引列,資料為1,3,5,當你查詢這一列》1的資料的時候,由於沒有間隙鎖的存在,mysql只會鎖住3和5,而這個時候有另乙個事務插入了4,之後又回滾了,那麼之前的查詢就會查詢4,而之後的查詢查不到4,這就是幻讀的問題。

幻讀的意思是,當乙個事務執行兩次,一次沒有讀取到的行,第二次卻讀取到了,那一行就稱為魔幻的一行..

// 幻讀的解釋

比read committed弱一級,沒有鎖的隔離,會導致髒讀。這是由於,當某些行沒有被鎖住的導致其他事務可以進行更新操作,從而引發讀取到髒資料。

髒讀的意思是,讀取到其他事務已經修改但是還沒有提交的資料。

在repeatable read的基礎上,自動的加入了 'lock in share' 語句。也就是說,在select的過程中,不允許其他需要獨佔鎖的操作發生(update等),只允許需要共享鎖的操作。

此隔離級別可以保證資料讀取完整的一致性,但是級會導致所有需要獨佔鎖的操作都變成了序列執行,效能和表鎖已經沒有區別了。

mysql術語大全

mysql官網對隔離性的介紹

在innodb還沒出現之前,myisam資料庫引擎只支援表級鎖,包括表級共享鎖和表級獨佔鎖。

共享鎖支援多個操作同時執行,也就是併發執行,在乙個操作擁有共享鎖的情況下,其他操作是無法獲取到獨佔鎖的。

獨佔鎖只能序列執行。

innodb支援行鎖,將鎖定物件的粒度細化,可以增加併發效能。

需要注意的是行級鎖是建立在索引之上的,也就是說在查詢沒有索引的字段的情況下,還是會使用表鎖。

對myisam引擎和innodb引擎很詳細的對比分析

在innodb的儲存引擎場景下,每次查詢,mysql都會給出當前表的快照,也就是說在該查詢之前其他提交的事務都會被感知,而查詢開始之後,其他提交的事務就不會被感知。

舉例而言

當你select count(*) from table的時候,其實統計的是當前表的快照,不會獲取任何鎖,如果與此同時,有另乙個插入操作,那麼這兩個操作是完全可以同時進行的。當然,這個結果可能不是你業務上希望看到的,可能你想要強一致性,也就是在統計資料量的時候不允許其他插入或者刪除操作,那麼你可以先lock table; select count(*) from table; 最後unlock table;通過表鎖的方式保證資料的強一致性。

mysql優化參考 六 隔離性(鎖)

一 隔離級別參考 二 鎖特性 常見集中問題 髒讀重複讀 同樣開啟兩個客戶端,並且關閉自動提交 還是上面的t1表 客戶端1 insert into t1 values 1 客戶端2 select from t1,記錄為空,說明解決了髒讀的問題 客戶端1 提交 commit 客戶端2 mysql sel...

MySQL的事務隔離級別和鎖

mysql的事務隔離級別 read uncommitted 讀未提交資料 read committed 讀已提交資料 repeatable read 可重讀 serializable 可序列化 檢視mysql的事務隔離級別 預設 全域性和會話事務隔離級別 select tx isolation se...

mysql隔離級別和鎖的講解

在資料庫操作中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別。資料庫鎖,實現這些隔離級別存在的。未提交讀 read uncommitted 允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料提交讀 read committed 只能讀取到已經提交的資料。oracle等多數資料庫預設都是...