MySQL - 无索引行锁升级为表锁
生活随笔
收集整理的這篇文章主要介紹了
MySQL - 无索引行锁升级为表锁
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 生猛干貨
- 無索引行鎖升級為表鎖演示
- 表結構
- 索引信息
- 操作演示
- 結論
- 搞定MySQL
生猛干貨
帶你搞定MySQL實戰,輕松對應海量業務處理及高并發需求,從容應對大場面試
無索引行鎖升級為表鎖演示
表結構
mysql> desc country; +-------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | countryname | varchar(255) | YES | | NULL | | | countrycode | varchar(255) | YES | | NULL | | +-------------+--------------+------+-----+---------+----------------+ 3 rows in set索引信息
mysql> show index from country; +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | country | 0 | PRIMARY | 1 | id | A | 5 | NULL | NULL | | BTREE | | | +---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 1 row in set這個表,只有主鍵索引,其他字段上未建立二級索引 。
現在使用沒有建立索引的字段進行操作,觀察其結果
操作演示
| begin 模擬開啟事務 | |
| update country set countryname = ‘CCC’ where countrycode = ‘xxx’ ; --更新成功,但未提交事務 | |
| begin 模擬開啟事務 | |
| update country set countryname = ‘DDD’ where countrycode = ‘anotherline’ ; ---- 一直被阻塞 ,直到超時 1205 - Lock wait timeout exceeded; try restarting transaction |
我們知道鎖主要是加在索引上,如果對非索引字段更新,行鎖可能會變表鎖 , 從上面的測試中也可以驗證這個觀點,第二個
結論
InnoDB的行鎖是針對索引加的鎖,不是針對記錄加的鎖 ,并且該索引不能失效,否則會從行鎖升級為表鎖 。
所以建表的時候 ,結合你的業務,如果有更新的操作,切記要對操作的字段建立索引,不然并發下這個問題就非常明顯了
搞定MySQL
總結
以上是生活随笔為你收集整理的MySQL - 无索引行锁升级为表锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL - 锁等待及死锁初探
- 下一篇: MySQL - 共享锁和排它锁初探