【MySQL】MySQL 常用語法之鎖表與解鎖表


mysql 鎖表語句:

Lock鎖整張表:

寫鎖定:

LOCK TABLES products WRITE

寫鎖,鎖定之后,只有當前線程可以進行讀操作和寫操作,其他線程讀操作和寫操作均被堵塞.....
讀鎖定:

LOCK TABLES products READ

讀鎖,鎖定之后,無論是當前線程還是其他線程均只能讀操作,寫操作全部被堵塞....

 解鎖:

UNLOCK TABLES;

 

行級鎖/排他鎖 [使用FOR UPDATE]

表需要是InnoDB引擎;

還需要配合事務,否則沒有效果[沒有事務的話,應該是鎖了執行完該句馬上又解鎖,看不到效果吧];

BEGIN;//啟動事務
SELECT * FROM products WHERE id=1 FOR UPDATE;//鎖定某一行 where條件需要主鍵 COMMIT;//事務提交[或者 ROLLBACK 事務回滾]

在啟動事務然后鎖定某一行后,在事務提交之前或者事務回滾之前該行會一直處於鎖定狀態,此時只允許當前線程進行讀寫操作,其他線程只能進行讀操作,其他寫操作全部被堵塞....

MYSQL中只有INNODB和BDB類型的數據表才能支持事務處理!其他的類型是不支持的!

 

補充:(2017-10-30)

Gap鎖,區間鎖。

1、當表數據id只有100-200,這100條數據

事務1:

select * from u_table where id=50 for update;

事務2:

insert into u_table(id)values(55);
#select * from u_table where id=55 for update;//無效,測試結論來看以下結論只對insert有效

此時事務2會等待事務1操作完才能執行。(事務2,id=45也等待, 245沒有等待)

結論:當鎖行數據不存在時,並且事務1,鎖的id(50)小於當前表的區間值時。則id小於現有數據的最小id的事務都會鎖定。區間鎖定在( -∞,100)

2、數據id依然是100-200,這100條數據

直接給結論:當鎖行數據不存在時,並且事務1,鎖的id(250)大於當前表的區間值時。則id大於現有數據的最大id的事務都會鎖定。區間鎖定在( 200,+∞)

3、數據id依然是100-200,300-400,這200條數據

直接給結論:當鎖行數據不存在時,並且事務1,鎖的id(250)在當前表的某一段區間內時。則id在這段區間內的事務都會鎖定。區間鎖定在( 200,300)

 

PS.以前一直認為行鎖,不會影響insert,現在看來,鎖行的數據不存在時,還是要小心點,不然容易出現死鎖

 


免責聲明!

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



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