1. 程式人生 > >為什麼要加鎖?行鎖、讀鎖(共享鎖)、寫鎖(排它鎖)

為什麼要加鎖?行鎖、讀鎖(共享鎖)、寫鎖(排它鎖)

#排它鎖 要等待?#session1 會話1start transaction;  update feedback set title='10:20' where id =1;#排它鎖COMMIT; #提交事務#session2 會話2start transaction;  select * from feedback where id=1;  update feedback set title='10:01' where id =1 ;#排它鎖#是否要等待讀鎖完成?COMMIT; #提交事務  select * from feedback where id=1 for update;#這個屬於讀鎖嗎?前提:在事務中加了read讀行鎖,例會話1中select * from feedback where id=1 for update;那麼其他會話(事務中或非事務中都)無法執行update id=1操作,必須要會話1提交事務才可執行。這就是行鎖,除id=1以外其他行都不影響update操作。說白了:如果用了 SELECT * FROM TABLE FOR UPDATE,或 select * from feedback where id=1 for update;其他的TRANS或非事務就不能對以上表或行進行UPDATE了直到以上的TRAN.COMMIT.試試就知道了.所以說,這種情況(加讀、寫鎖)一般是針對事務隔離級別為
Read Uncommitted;來說的,因為這個級別會出現髒讀、幻讀之類的(但併發效能比較快些)。

#session1 會話1
start transaction;
select * from feedback where id<10 for update;#這個屬於讀鎖
COMMIT; #提交事務

#session2 會話2
start transaction;
update feedback set title='10:01' where id =8 ;#排它鎖#要等待讀鎖完成commit
COMMIT; #提交事務


#session3 會話3
start transaction;
update feedback set title='10:01' where id =12 ;#排它鎖#不要等待
COMMIT; #提交事務