一、什么是共享鎖,什么是排他鎖?
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方式獲取排他鎖。
