1.鎖的類型
鎖有共享鎖(S)和排它鎖(X)
以及隐性鎖和顯性鎖。
如select * from xx for update
這樣現性的增加了一個表鎖在表之上。
而update和delete則會隐性的在表上或者行上增加一個鎖。
2.行鎖和表鎖
(1)行鎖
對記錄的的鎖定,如update和delete操作會加鎖,這時關于這條記錄的查詢操作是不能進行的,需要等待;
(2)表鎖
對表一級的鎖定,所有對這個表的查詢都将被挂起,直到事務完成。
3.删除操作增加鎖的差別
如果要是批量删除某些記錄,如果在高并發情況下,如果使用非主鍵和索引的字段進行删除,如用exist關鍵字的查詢,則會将整個表進行了鎖定。
這種情況下,好多的查詢都處于等待的狀态這樣,性能自然不會高。
而如果使用主鍵索引的字段進行删除、如用遊标進行删除,那麼就是增加的行鎖,鎖定隻是對行一級的鎖定,并不影響對其他行的查詢。
在更改了删除方式之後,Deadlock found when trying to get lock; try restarting transaction,這個錯誤有效的減少了。
這個錯誤是說,mysql發現了一個死鎖,那麼就重新開機這個事務,這樣就解決了資料死鎖的問題。
而且因為這個機制的存在,資料庫用innodb引擎\4CORE\4G的條件下跑出40并發no thinking 的成績,性能還是不錯的。