MySQL - 无索引行锁升级为表锁
生活随笔
收集整理的這篇文章主要介紹了
MySQL - 无索引行锁升级为表锁
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 生猛干貨
- 無索引行鎖升級(jí)為表鎖演示
- 表結(jié)構(gòu)
- 索引信息
- 操作演示
- 結(jié)論
- 搞定MySQL
生猛干貨
帶你搞定MySQL實(shí)戰(zhàn),輕松對(duì)應(yīng)海量業(yè)務(wù)處理及高并發(fā)需求,從容應(yīng)對(duì)大場(chǎng)面試
無索引行鎖升級(jí)為表鎖演示
表結(jié)構(gòu)
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這個(gè)表,只有主鍵索引,其他字段上未建立二級(jí)索引 。
現(xiàn)在使用沒有建立索引的字段進(jìn)行操作,觀察其結(jié)果
操作演示
| begin 模擬開啟事務(wù) | |
| update country set countryname = ‘CCC’ where countrycode = ‘xxx’ ; --更新成功,但未提交事務(wù) | |
| begin 模擬開啟事務(wù) | |
| update country set countryname = ‘DDD’ where countrycode = ‘a(chǎn)notherline’ ; ---- 一直被阻塞 ,直到超時(shí) 1205 - Lock wait timeout exceeded; try restarting transaction |
我們知道鎖主要是加在索引上,如果對(duì)非索引字段更新,行鎖可能會(huì)變表鎖 , 從上面的測(cè)試中也可以驗(yàn)證這個(gè)觀點(diǎn),第二個(gè)
結(jié)論
InnoDB的行鎖是針對(duì)索引加的鎖,不是針對(duì)記錄加的鎖 ,并且該索引不能失效,否則會(huì)從行鎖升級(jí)為表鎖 。
所以建表的時(shí)候 ,結(jié)合你的業(yè)務(wù),如果有更新的操作,切記要對(duì)操作的字段建立索引,不然并發(fā)下這個(gè)問題就非常明顯了
搞定MySQL
總結(jié)
以上是生活随笔為你收集整理的MySQL - 无索引行锁升级为表锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL - 锁等待及死锁初探
- 下一篇: MySQL - 共享锁和排它锁初探