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,現在看來,鎖行的數據不存在時,還是要小心點,不然容易出現死鎖