生猛干货
带你搞定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
这个表,只有主键索引,其他字段上未建立二级索引 。
现在使用没有建立索引的字段进行操作,观察其结果
操作演示
我们知道锁主要是加在索引上,如果对非索引字段更新,行锁可能会变表锁 , 从上面的测试中也可以验证这个观点,第二个
结论
InnoDB的行锁是针对索引加的锁,不是针对记录加的锁 ,并且该索引不能失效,否则会从行锁升级为表锁 。
所以建表的时候 ,结合你的业务,如果有更新的操作,切记要对操作的字段建立索引,不然并发下这个问题就非常明显了
搞定MySQL
https://artisan.blog.csdn.net/article/details/107717345?spm=1001.2014.3001.5502