知識綜述:
[1] mysql中鎖的種類:
常見的表鎖和行鎖,也有metadata lock等等,表鎖是對一整張表加鎖,分為讀鎖和寫鎖,因為是鎖住整張表,所以會導致併發能力下降,一般是做ddl處理時使用。
行鎖則是鎖住資料行,這種加鎖方法比較複雜,但是由於只鎖住有限的資料,對於其它資料不加限制,所以併發能力強,mysql一般都是用行鎖來處理併發事務
[2] mysql四種隔離機制
未提交讀(read uncommitted):允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料。
提交讀(read committed):只能讀取到已經提交的資料。oracle等多數資料庫預設都是該級別 (不重複讀)。
可重複讀(repeated read):可重複讀。在同乙個事務內的查詢都是事務開始時刻一致的,innodb預設級別。在sql標準中,該隔離級別消除了不可重複讀,但是還存在幻象讀。
序列讀(serializable):完全序列化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞。
[3]多版本併發控制mvcc
mysql innodb儲存引擎,實現的是基於多版本的併發控制協議——mvcc.
mvcc最大的好處,相信也是耳熟能詳:讀不加鎖,讀寫不衝突。在讀多寫少的oltp應用中,讀寫不衝突是非常重要的,極大的增加了系統的併發效能,這也是為什麼現階段,幾乎所有的rdbms,都支援了mvcc。
在mvcc併發控制中,讀操作可以分成兩類:快照讀 (snapshot read)與當前讀 (current read).
快照讀:簡單的select操作,屬於快照讀,不加鎖。(當然,也有例外,下面會分析)
select * from table where ?;
當前讀:特殊的讀操作,插入/更新/刪除操作,屬於當前讀,需要加鎖。
select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
1、如何理解mysql中加鎖原理
mysql加鎖機制 :
根據型別可分為共享鎖(shared lock)和排他鎖(exclusive lock)或者叫讀鎖(read lock)和寫鎖(write lock)。
根據粒度劃分又分表鎖和行鎖。表鎖由資料庫伺服器實現,行鎖由儲存引擎實現。
爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.
此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的程序稱為死鎖程序.
表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的innodb.
死鎖的關鍵在於:兩個(或以上)的session加鎖的順序不一致。
那麼對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序
3、mysql連線池的連線數說爆就爆了?
出現這種錯誤明顯就是 mysql_connect 之後忘記 mysql_close;
當大量的connect之後,就會出現too many connections的錯誤。
posted on
2019-04-10 10:13
sun_y 閱讀(
...)
編輯收藏
面試常問MySQL效能優化問題
知識綜述 1 mysql中鎖的種類 常見的表鎖和行鎖,也有metadata lock等等,表鎖是對一整張表加鎖,分為讀鎖和寫鎖,因為是鎖住整張表,所以會導致併發能力下降,一般是做ddl處理時使用。行鎖則是鎖住資料行,這種加鎖方法比較複雜,但是由於只鎖住有限的資料,對於其它資料不加限制,所以併發能力強...
mysql常問內容 mysql常問問題
前言 一些自己遇到的問題及理解 需補充修改 索引型別 主鍵索引 普通索引 符合索引 唯一索引 全文索引 索引 查詢資料的資料結構,索引占用磁碟空間,更新資料的時候影響更新表的效率 資料儲存型別 聚簇索引 非聚簇索引 聚簇 採用b 樹的資料結構,聚簇索引葉子節點存放證章表的資料,所以主鍵索引就是用的聚...
python基礎面試常問程式設計問題
求數值以內的質數,合數及個數 質數 defzhishu number num 0for i in range 2 number 1 k true for j in range 2 i if i j continue if i j 0 k false break if k true print d i...