mysql共享鎖 排他鎖 意向鎖

2021-09-14 05:56:53 字數 2776 閱讀 9980

mysql鎖機制分為表鎖和行鎖,其中行鎖又包括了共享鎖與排他鎖。

又稱為讀鎖(s鎖),當有多個事務時,多個事務對於同一資料可以共享乙個鎖,都能訪問到資料,但是其他事務只能讀不能寫。

又稱為寫鎖(x鎖),當有多個事務時,排他鎖不能與其他鎖並存,乙個事務獲取了一行資料的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖與排他鎖。  但是獲取排他鎖的事務是可以對資料進行讀取和修改的。

共享鎖就是多個事務只能讀資料不能改資料。排他鎖是指乙個事務在一行資料加上排他鎖後,其他事務不能再在其上面加其他的鎖。innodb引擎預設的修改資料語句,update,insert,delete都會自動給涉及到的資料加上排他鎖,select語句預設不加鎖,如果加共享鎖可以用select ... lock in share mode語句。 如果加排他鎖可以使用select ... for update語句。 加過排他鎖的資料行在其他事務中是不能修改資料的,也不能通過for update和lock in share mode鎖的方式查詢資料,但可以直接通過select ... from ...查詢資料,因為普通查詢沒有任何鎖機制。

首先關閉自動提交:

測試資料如下(一切從簡哈),然後開啟兩個查詢視窗。

首先進行共享鎖測試: 下面的都是先執行左邊再執行右邊

共享鎖與共享鎖:

兩個視窗都使用共享鎖查詢,能夠共享這條資料。

共享鎖與排他鎖:

當一條資料別共享鎖鎖住時,不能對資料進行修改,排他鎖不能與共享鎖共存,會處於堵塞狀態等待共享鎖事務提交。

事務提交後就可以進行修改了

共享鎖與普通查詢:

都能查詢到資料

再進行排他鎖測試: 下面的都是先執行左邊再執行右邊

排他鎖與排他鎖:

排他鎖與共享鎖:

可以看到都處於阻塞狀態,id=1的資料已經被加上了排他鎖,必須等到鎖釋放才能加上別的鎖。

不加鎖的查詢是可以查詢到資料的,因為沒有鎖機制不與排他鎖互斥。

查詢其他行也可以查詢到資料。

innodb所用的表級鎖,其設計目的主要是為了在乙個事務中揭示下一步將要被請求的鎖的型別。

innodb中的兩個表鎖:

意向共享鎖(is):表示事務準備給資料行加入共享鎖,也就是說乙個資料行加共享鎖前必須先取得該錶的is鎖

意向排他鎖(ix):類似上面,表示事務準備給資料行加入排他鎖,說明事務在乙個資料行加排他鎖前必須先取得該錶的ix鎖。

意向鎖是innodb自動加的,不需要使用者干預。

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的部落格,可以看下哦。

mysql架構與儲存引擎 (myisam與inoodb)

MySQL 共享鎖 互斥鎖 意向鎖。

經常聽到資料庫的鎖機制,不同的資料庫的不同實現不同,聽多了就頭疼了,今天就把mysql的鎖整的明明白白 首先想一下為什麼我們會需要鎖,其實就是為了解決併發運算元據的,是一種控制併發的機制。樂觀鎖和悲觀鎖其實是兩種思想,用來指導實現鎖的功能的不同實現思想,在這兩種指導思想下產生了對應的鎖 我們可以對一...

MySQL 共享排他鎖 mysql 共享排他鎖

1 基礎知識 共享鎖又叫s鎖 share locks 共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又叫x鎖 exclusive locks,記為x鎖 排他鎖就是不能與其他鎖並存,只有等待鎖釋放完成以後其他事務才能得到鎖。下面是共享鎖與排他鎖的互斥關係 s ...

mysql排他鎖 mysql共享鎖與排他鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...