MySQL表級鎖與行級鎖

表級鎖

MySQL表級鎖分爲讀鎖和寫鎖。

讀鎖

用法:LOCK TABLE table_name [ AS alias_name ] READ

釋放鎖使用UNLOCK tables.可以爲表使用別名,如果一旦使用別名在使用的時候也必須採用別名。成功申請讀鎖的前提是當前沒有線程對該表使用寫鎖,否則該語句會被阻塞。申請讀鎖成功後,其他線程也可以對該表進行讀操作,但不允許有線程對其進行寫操作,就算是當前線程也不允許。當鎖住了A表之後,就只能對A表進行讀操作,對其他表進行讀操作會出現錯誤(tablename was not locked with LOCK TABLES)

寫鎖

用法: LOCK TABLE table_name [AS alias_name] [ LOW_PRIORITY ] WRITE

同樣也可以使用別名,與讀鎖不同的是,寫鎖中可以指定鎖的優先級。LOW_PRIORITY是一種比讀鎖更低優先級的鎖,當多個線程同時申請多種鎖(LOW_PRIORITY,READ,WRITE)時,LOW_PRIORITY的優先級最低。讀鎖申請成功的前提是沒有線程對錶加讀鎖和其他寫鎖,否則會被阻塞。

表級鎖在MyISAM和innoDB中都有用到,創建鎖的開銷小,不會出現死鎖,由於鎖定的是整張表,所以併發度低。當需要頻繁對大部分數據做 GROUP BY 操作或者需要頻繁掃描整個表時,推薦使用表級鎖。

行級鎖

行級鎖是Mysql中鎖定粒度最細的一種鎖,能大大減少數據庫操作的衝突,由於其粒度小,加鎖的開銷最大。行級鎖分爲共享鎖和排他鎖。

共享鎖(S LOCK)

用法:SELECT ...LOCK IN SHARE MODE;
Mysql會對查詢結果中的每行都加共享鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請共享鎖,否則會被阻塞。其他線程也可以讀取使用了共享鎖的表,而且這些線程讀取的是同一個版本的數據。

排他鎖(X LOCK)

用法:SELECT ...LOCK FOR UPDATE;
Mysql會對查詢結果中的每行都加排他鎖,當沒有其他線程對查詢結果集中的任何一行使用排他鎖時,可以成功申請排他鎖,否則會被阻塞。
行級鎖都是基於索引的,如果一條SQL語句用不到索引是不會使用行級鎖的,會使用表級鎖。行級鎖的缺點是:由於需要請求大量的鎖資源,所以速度慢,內存消耗大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章