InnoDB和MyISAM的鎖的區別和聯絡

2021-10-08 14:21:34 字數 1915 閱讀 3289

innodb預設是行級鎖,支援表鎖,也就在innodb中更新某條資料會對行上鎖,如果是排他鎖,那麼其他的事務訪問這一行的資料需要等鎖釋放之後才能進行,而對其他行資料是沒有影響的。

myisam預設是表級鎖,不支援行級鎖,也就是在myisam中進行某條資料更新時,會對整個表上鎖,所有的其他事務對錶中對資料進行訪問或者更新的時候都必須等那個事務釋放表鎖。

需要注意的是,當innodb不走索引的時候,就會預設上表級鎖了。

行鎖與表鎖的區別:

因為行級鎖需要掃瞄命中對應的那一行才能上鎖,所以上鎖消耗的時間更大,而且容易出現死鎖的問題。而表級鎖只需要鎖住整張表,所以上鎖消耗並不大,並且不會出現死鎖的問題。

死鎖的乙個例子:

事務1事務2

begin

begin

update t set k = 1 where id = 1

update t set k = 1 where id = 2

update t set k = 2 where id = 2

update t set k = 1 where id = 1

commit

commit

如上的例子,事務2在等待事務1釋放id為1那一行的鎖,而事務1在等待事務2釋放id為1那一行的鎖,這樣就造成了死鎖

myisam的適用場景:

innodb適用的場景:

為什麼myisam查詢比innodb快?

innodb只有乙個聚簇索引,其他都是非聚簇索引,當sql語句走非聚簇索引當時候需要進行兩次索引查詢。而myisam全都是非聚簇索引,而且索引的葉子節點都指向資料檔案的位址,所以只需要走一次索引

innodb在select的時候需要維護的東西比myisam多。1.

innodb 要快取資料和索引,myisam只快取索引塊。2.innodb定址要對映到塊,再到行,myisam記錄的直接是檔案的offset,定位比innodb要快

以select count(*) 來說,innodb需要全表掃瞄,而myisam維護有乙個值可以實時獲取

innodb和myisam都擁有共享鎖和排他鎖,他們的相容性如下:

事務t1共享鎖+事務t2共享鎖 = 相容

事務t1共享鎖+事務t2排他鎖 = 不相容

事務t1排他鎖+事務t2共享鎖 = 不相容

事務t1排他鎖+事務t2排他鎖 = 不相容

以innodb行鎖為例,也就是只有某個事務對某一行實行了排他鎖,那麼這一行就不能被其他任何事務所操作。而對這一行實行了共享鎖,其他事務還可以對這一行只能進行讀操作。

例子:我們開啟兩個事務,並把auto-commit設定為false,也就是不會自動commit,我們需要在執行完對應的語句之後再呼叫commit才會對事務進行提交。

我們按照以下對邏輯進行測試:

事務1

select * form t where id = 3;
事務2

update t set name = *** where id = 3;
可以神奇地發現事務2竟然沒有被阻塞,這是因為mysql對select進行了優化,不會阻塞其他事務。我們可以在select 語句後面加上lock in share mode,就可以對語句對應對行設定共享鎖了,我們重新開啟測試

事務1

select * form t where id = 3 lock in share mode;
事務2

update t set name = *** where id = 3;
這時候事務2就會一直阻塞了,這樣子就成功展示出了共享鎖與排他鎖衝突的場景。

這時對事務1進行commit,事務1就會釋放行級鎖,這時候事務2對update語句就會往下執行不會阻塞了。

MyISAM和InnoDB鎖理解

mysql的儲存引擎是從myisam到innodb,鎖從表鎖到行鎖。後者的出現從某種程度上是彌補前者的不足。比如 myisam不支援事務,innodb支援事務。表鎖雖然開銷小,鎖表快,但高併發下效能低。行鎖雖然開銷大,鎖表慢,但高併發下相比之下效能更高。事務和行鎖都是在確保資料準確的基礎上提高併發的...

InnoDB和MyIsAM的區別

myisam型別不支援事務處理等高階處理,而innodb型別支援 這是網上對myisam和innodb的解釋,很抽象吧,我們用白話的方式解釋一下 其實也比較簡單 所謂事務處理,就是原子性操作。打個比方,支援事務處理的innodb表,建設乙個中,發帖是給積分的。你發了乙個帖子執行乙個insert語句,...

MyISAM和InnoDB的區別

mysql預設採用的是myisam。myisam不支援事務,而innodb支援。innodb的autocommit預設是開啟的,即每條sql語句會預設被封裝成乙個事務,自動提交,這樣會影響速度,所以最好是把多條sql語句顯示放在begin和commit之間,組成乙個事務去提交。innodb支援資料行...