共享鎖 排他鎖 意向共享鎖 意向排他鎖


一、什么是共享鎖,什么是排他鎖?


1、共享鎖:

共享鎖就是多個事務對於同一數據共享一把鎖,都能訪問到數據,但是只能讀不能修改。共享鎖又稱為讀鎖,簡稱S鎖。

原理:一個事務獲取了一個數據行的共享鎖,其他事務能獲得該行對應的共享鎖,但不能獲得排他鎖,即一個事務在讀取一個數據行的時候,其他事務也可以讀,但不能對該數據行進行增刪改(因為增刪改都是自動加排它鎖)。

2、排他鎖:

排他鎖就是不能與其它鎖並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他
鎖的事務是可以對數據就行讀取和修改。排他鎖又稱為寫鎖,簡稱X鎖。

原理:一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖(排他鎖或者共享鎖),即一個事務在讀取一個數據行的時候,其他事務不能對該數據行進行增刪改,不加鎖的查是可以的,加鎖的查是不可以的。

3、如何設置共享鎖和排他鎖?:

設置共享鎖:SELECT ... LOCK IN SHARE MODE; 共享鎖都是行鎖
設置排他鎖:SELECT ... FOR UPDATE; 排它鎖可以使行鎖也可以是表鎖

對於共享鎖大家可能很好理解,就是多個事務只能讀數據不能改數據;排他鎖指的是一個事務在一行數據加上排他鎖后,其他事務不能再在其上加其他的鎖。mysql InnoDB引擎默認的修改數據語句,update,delete,insert都會自動給涉及到的數據加上排他鎖,select語句默認不會加任何鎖類型,所以加過排他鎖的數據行在其他事務中是不能修改數據的,也不能通過for update和lock in share mode鎖的方式查詢數據,但可以直接通過select ...from...查詢數據,因為普通查詢沒有任何鎖機制。

4、注意點:

①、對於select 語句,innodb不會加任何鎖,也就是可以多個並發去進行select的操作,不會有任何的鎖沖突,因為根本沒有鎖。
②、對於insert,update,delete操作,innodb會自動給涉及到的數據加排他鎖,只有查詢select需要我們手動設置排他鎖。

二、什么是意向共享鎖,什么是意向排他鎖?

1、意向共享鎖:

簡稱IS,其作用在於:通知數據庫接下來需要施加什么鎖並對表加鎖。如果需要對記錄A加共享鎖,那么此時innodb會先找到這張表,對該表加意向
共享鎖之后,再對記錄A添加共享鎖。

2、意向排他鎖:

簡稱IX,其作用在於:通知數據庫接下來需要施加什么鎖並對表加鎖。如果需要對記錄A加排他鎖,那么此時innodb會先找到這張表,對該表加意向
排他鎖之后,再對記錄A添加排他鎖。

意向共享鎖和意向排它鎖是數據庫主動加的,不需要我們手動處理

三、共享鎖和意向共享鎖,排他鎖與意向排他鎖的區別?

共享鎖和排他鎖,系統在特定的條件下會自動添加共享鎖或者排他鎖,也可以手動添加共享鎖或者排他鎖。
意向共享鎖和意向排他鎖都是系統自動添加和自動釋放的,整個過程無需人工干預。
共享鎖和排它鎖,可能鎖定的是表,也可能鎖定的是行
例如 
SELECT count(*) as total FROM test WHERE username = "mraz" FOR UPDATE
當username是主鍵時,鎖定的是行鎖,
當username不是主鍵時,是表鎖

InnoDB行鎖是通過索引上的索引項來實現的,這一點MySQL與Oracle不同,后者是通過在數據中對相應數據行加鎖來實現的。 InnoDB這種行鎖實現特點意味者:只有通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖!
在實際應用中,要特別注意InnoDB行鎖的這一特性,不然的話,可能導致大量的鎖沖突,從而影響並發性能。

意向共享鎖和意向排他鎖鎖定的是表。

意向鎖是InnoDB自動加的,不需用戶干預。對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及及數據集加排他鎖(X);對於普通SELECT語句,InnoDB不會任何鎖;事務可以通過以下語句顯示給記錄集加共享鎖或排鎖。

用SELECT .. IN SHARE MODE獲得共享鎖,主要用在需要數據依存關系時確認某行記錄是否存在,並確保沒有人對這個記錄進行UPDATE或者DELETE操作。但是如果當前事務也需要對該記錄進行更新操作,則很有可能造成死鎖,對於鎖定行記錄后需要進行更新操作的應用,應該使用SELECT ... FOR UPDATE方式獲取排他鎖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM