mysql 鎖機制

來源:互聯網
上載者:User

標籤:group   share   多個   har   name   版本   頻繁   pre   isa   

mysql鎖機制分為表級鎖和行級鎖表級鎖對整個表回鎖,寫鎖或讀鎖(Unlock tables)

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 操作或者需要頻繁掃描整個表時,推薦使用表級鎖。

 

行級鎖有共用鎖定(讀鎖),獨佔鎖定(寫鎖)

  只有通過索引檢索時才會加行級鎖,行級鎖都是基於索引的,如果一條SQL語句用不到索引是不會使用行級鎖的,會使用表級鎖。行級鎖的缺點是:由於需要請求大量的鎖資源,所以速度慢,記憶體消耗大

  共用鎖定多個事務對同一個資料可以共用一把鎖,都能訪問資料,但唯讀不可改,Mysql會對查詢結果中的每行都加共用鎖定,當沒有其他線程對查詢結果集中的任何一行使用獨佔鎖定時,可以成功申請共用鎖定,否則會被阻塞。其他線程也可以讀取使用了共用鎖定的表,而且這些線程讀取的是同一個版本的資料

SELECT ...LOCK IN SHARE MODE;

  獨佔鎖定,擷取該鎖事務可讀,修改,Mysql會對查詢結果中的每行都加獨佔鎖定,當沒有其他線程對查詢結果集中的任何一行使用獨佔鎖定時,可以成功申請獨佔鎖定,否則會被阻塞

SELECT ...LOCK FOR UPDATE;
死結

死結產生的根本原因是兩個以上的進程都要求對方釋放資源,以至於進程都一直等待。在代碼上是因為兩個或者以上的事務都要求另一個釋放資源。

mysql 鎖機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.