06、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

这个表,只有主键索引,其他字段上未建立二级索引 。

现在使用没有建立索引的字段进行操作,观察其结果


操作演示

session1 session2
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

*

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: