天天看點

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