今天看到簡朝陽的書上的一句話,如下:
當Query無法利用索引的時候,Innodb會放棄使用行級別鎖定而改用表級別鎖定,造成併發效率的降低。
看到這句話,開始讓我有種不信的感覺,所以親自測試下,MYSQL版本爲5.5,
過程如下:
表中的a b都是無索引的
開啓兩個事務,事務A進行更新,之後事務B也進行更新,但是更新的是不同的兩行。結果如下
執行B的更新
我們看到B事務此時阻塞,結果和書上說的一樣,有些吃驚,這麼說寫操作一定要注意where條件了,一定要使用索引來避免全表鎖定。
因爲Innodb是基於索引來實現行鎖的,如果不存在索引,那麼就不能對此行加record lock,而mysql爲了防止錯誤,只好全部鎖定了。