天天看點

[MySQL]InnoDB引擎的行鎖和表鎖

1.行鎖和表鎖

在mysql 的 InnoDB引擎支援行鎖,與Oracle不同,mysql的行鎖是通過索引加載的,即是行鎖是加在索引響應的行上的,要是對應的SQL語句沒有走索引,則會全表掃描,

行鎖則無法實作,取而代之的是表鎖。

2.連表鎖機制

在連表操作中,雙方表選中的是以行當中一旦有一條在鎖定中,則整個查詢會被阻塞。

3.死鎖

假如有記錄1和2,當兩個并行的事務a和b,a修改了記錄1,而b修改了記錄2,兩個事物均未送出的情況下,a想接着修改記錄2,而b想接着修改記錄1,雙方都等待着自己要修改的記錄鎖釋放,結果是雙方都會陷入無限阻塞中,

形成死鎖,不過由于Mysql的異常機制導緻後送出的mysql程序(也就是觸發死鎖的程序)會抛出錯誤:[Err] 1213 - Deadlock found when trying to get lock; try restarting transaction,因為一方抛出異常釋放了鎖定結束了,而另外一個程序則無感覺,可以正常送出事務。

4.事件隔離級别

MySQL InnoDB的預設事件隔離級别是"REPEATABLE READ",未送出的事務,修改是不被展現在沒加鎖的查詢上的,如果對資料一緻性要求很高的查詢,建議加上共享鎖。