在資料庫的鎖定機制中介紹過,在DBMS中,可以依照鎖定的粒度把資料庫鎖定分成行級鎖定(INNODB引擎)、表格層級鎖定(MYISAM引擎)和頁級鎖定(BDB引擎 )。
行級鎖定是Mysql中鎖定粒度最細的一種鎖,表示只針對目前操作的行進行加鎖。行級鎖能大幅減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖 和 排他鎖。
開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖定衝突的機率最低,並發度也最高。
表格層級鎖定是MySQL中鎖定粒度最大的一種鎖,表示對目前操作的整個表格加鎖,它實現簡單,資源消耗較少,被大部分MySQL引擎支援。最常使用的MYISAM與INNODB都支援表級鎖定。表級鎖定分為表共享讀鎖(共享鎖)與表獨佔寫鎖(排他鎖)。
開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發出鎖定衝突的機率最高,並發度最低。
頁級鎖定是MySQL中鎖定粒度介於行級鎖定和表格級鎖定中間的一種鎖定。表級鎖定速度快,但衝突多,行級衝突少,但速度慢。所以取了折衷的頁級,一次鎖定鄰近的一組記錄。 BDB支援頁級鎖定
開銷與加鎖時間界於表鎖與行鎖之間;會出現死鎖;鎖定粒度界於表鎖與行鎖之間,並發度一般
MyISAM和MEMORY採用表級鎖定(table-level locking)
BDB採用頁面鎖定(page -level locking)或表格級鎖定,預設為頁面鎖定
InnoDB支援行級鎖定(row-level locking)和表格層級鎖定,預設為行級鎖定
由於MySQL 的行鎖是針對索引加的鎖,不是針對記錄加的鎖,所以雖然是訪問不同行的記錄,但是如果是使用相同的索引鍵,是會出現鎖衝突的。應用設計的時候要注意這一點。
當表有多個索引的時候,不同的事務可以使用不同的索引鎖定不同的行,另外,不論是使用主鍵索引、唯一索引或普通索引,InnoDB 都會使用行鎖來對資料加鎖。
3、對於非常容易產生死鎖的業務部分,可以嘗試使用升級鎖定顆粒度,透過表級鎖定來減少死鎖產生的機率
行級鎖是Mysql中鎖定粒度最細的一種鎖,行級鎖能大幅減少資料庫操作的衝突。行級鎖分為共享鎖及排他鎖兩種,本文將詳細介紹共享鎖及排他鎖的概念、使用方式及注意事項等。
共享鎖定又稱為讀鎖,是讀取操作所建立的鎖定。其他使用者可以並發讀取數據,但任何事務都不能對數據進行修改(獲取數據上的排他鎖),直到已釋放所有共享鎖。
如果交易T對資料A加上共享鎖定後,則其他交易只能對A再加共享鎖,不能加排他鎖。獲準共享鎖的事務只能讀數據,不能修改數據。
SELECT ... LOCK IN SHARE MODE;
#在查詢語句後面增加LOCK IN SHARE MODE,Mysql會對查詢結果中的每行都加共享鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他執行緒也可以讀取使用了共享鎖的表,而這些執行緒讀取的是同一個版本的資料。
排他鎖又稱寫鎖,如果事務T對資料A加上排他鎖後,則其他事務不能再對A加任任何類型的封鎖。獲準排他鎖的事務既能讀取數據,又能修改數據。
SELECT ... FOR UPDATE;
在查詢語句後面增加FOR UPDATE,Mysql就會對查詢結果中的每行都加排他鎖,當沒有其他執行緒對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。
意向鎖是表級鎖,其設計目的主要是為了在一個事務中揭示下一行將要被請求鎖的類型。 InnoDB中的兩個表鎖定:
意向共享鎖定(IS):表示交易準備在資料行中加入共享鎖定,也就是說一個資料行加上共享鎖定前必須先取得該表的IS鎖定
意向排他鎖(IX):類似上面,表示交易準備給資料行加入排他鎖,說明交易在一個資料行加排他鎖前必須先取得該表的IX鎖。
意向鎖定是InnoDB自動加的,不需要使用者乾預。
對於insert、update、delete,InnoDB會自動為涉及的資料加排他鎖(X);對於一般的Select語句,InnoDB不會加任何鎖,交易可以透過以下語句為顯示加上共享鎖或排他鎖。
共享鎖定:SELECT ... LOCK IN SHARE MODE;
排他鎖:SELECT ... FOR UPDATE;
相關推薦:
以上是MYSQL中的鎖介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!