(2)經過執行命令SET LOW_PRIORITY_UPDATES=1
,使該鏈接發出的更新請求優先級下降。mysql
(3)經過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,下降該語句的優先級。sql
(4)給系統參數max_write_lock_count設置一個合適的值,當一個表的讀鎖達到這個值後,MySQL就暫時將寫請求的優先級下降,給讀進程必定得到鎖的機會。數據庫
二,InnoDBsession
1,該引擎採用行級鎖與表級鎖。併發
行鎖:共享鎖(S)與排他鎖(X)。spa
表鎖:意向排他鎖與意向共享鎖。code
表鎖是由mysql自動添加的。select添加共享鎖,update、insert、delete添加排他鎖。server
2,行鎖實現方式。索引
InnoDB是經過給索引項添加鎖來實現行級鎖的,這個特色意味着:隊列
(1)只有經過索引條件檢索數據,InnoDB才使用行級鎖,不然,InnoDB 將使用表鎖。
(2)因爲MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,因此雖然是訪問不一樣行的記錄,可是若是是使用相同的索引鍵,是會出現鎖衝突的。
(3)當表有多個索引的時候,不一樣的事務可使用不一樣的索引鎖定不一樣的行,另外,不管是使用主鍵索引、惟一索引或普通索引,InnoDB 都會使用行鎖來對數據加鎖。(雖然使用的是不一樣的索引,可是若是記錄已經被其餘session鎖定的話也是須要等待的。)
(4)即使在條件中使用了索引字段,可是否使用索引來檢索數據是由MySQL 經過判斷不一樣執行計劃的代價來決定的,若是MySQL 認爲全表掃描效率更高,好比對一些很小的表,它就不會使用索引,這種狀況下InnoDB將使用表鎖,而不是行鎖。
=================================================================
Mysql分爲server層與引擎層。
鏈接創建在server上,後續加鎖下沉到不一樣的存儲引擎實現。
一,分析Innodb加鎖過程。Myisam只有表鎖。
分析加鎖過程的前提條件,事務隔離級別。
數據庫併發產生的問題
===========================================================================================
隔離級別 髒讀(Dirty Read) 不可重複讀(NonRepeatable Read) 幻讀(Phantom Read)
===========================================================================================
未提交讀(Read uncommitted) 可能 可能 可能
已提交讀(Read committed) 不可能 可能 可能
可重複讀(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能
===========================================================================================