1. 程式人生 > >mysql innodb 事務操作的表鎖及行鎖-Deadlock found when trying to get lock; try restarting transaction的優化

mysql innodb 事務操作的表鎖及行鎖-Deadlock found when trying to get lock; try restarting transaction的優化

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 的成績,效能還是不錯的。