mysql innodb 事務操作的表鎖及行鎖-Deadlock found when trying to get lock; try restarting transaction的優化
阿新 • • 發佈:2019-02-07
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 的成績,效能還是不錯的。