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

mysql 鎖表語句:mysql

Lock鎖整張表:sql

寫鎖定:測試

LOCK TABLES products WRITE

寫鎖,鎖定以後,只有當前線程能夠進行讀操做和寫操做,其餘線程讀操做和寫操做均被堵塞.....
讀鎖定:spa

LOCK TABLES products READ

讀鎖,鎖定以後,不管是當前線程仍是其餘線程均只能讀操做,寫操做所有被堵塞....線程

 解鎖:code

UNLOCK TABLES;

 

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

表須要是InnoDB引擎;事務

還須要配合事務,不然沒有效果[沒有事務的話,應該是鎖了執行完該句立刻又解鎖,看不到效果吧];table

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

在啓動事務而後鎖定某一行後,在事務提交以前或者事務回滾以前該行會一直處於鎖定狀態,此時只容許當前線程進行讀寫操做,其餘線程只能進行讀操做,其餘寫操做所有被堵塞....class

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

 

補充:(2017-10-30)

Gap鎖,區間鎖。

一、當表數據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)

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

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

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

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

 

PS.之前一直認爲行鎖,不會影響insert,如今看來,鎖行的數據不存在時,仍是要當心點,否則容易出現死鎖

相關文章
相關標籤/搜索