知識綜述:
[1] MySQL中鎖的種類:
常見的表鎖和行鎖,也有Metadata Lock等等,表鎖是對一整張表加鎖,分為讀鎖和寫鎖,因為是鎖住整張表,所以會導致並發能力下降,一般是做ddl處理時使用。
行鎖則是鎖住數據行,這種加鎖方法比較復雜,但是由於只鎖住有限的數據,對於其它數據不加限制,所以並發能力強,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)。
根據粒度划分又分表鎖和行鎖。表鎖由數據庫服務器實現,行鎖由存儲引擎實現。
2、MySQL最終死鎖形成的原因
爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.
此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的進程稱為死鎖進程.
表級鎖不會產生死鎖.所以解決死鎖主要還是針對於最常用的InnoDB.
死鎖的關鍵在於:兩個(或以上)的Session加鎖的順序不一致。
那么對應的解決死鎖問題的關鍵就是:讓不同的session加鎖有次序
3、MySQL連接池的連接數說爆就爆了?
出現這種錯誤明顯就是 mysql_connect 之后忘記 mysql_close;
當大量的connect之后,就會出現Too many connections的錯誤。