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,如今看來,鎖行的數據不存在時,仍是要當心點,否則容易出現死鎖