mysql中Innodb 行锁实现原理

 更新时间:2024年10月21日 10:25:26   作者:程序猿进阶  
InnoDB的行锁是通过索引项加锁实现的,分为使用索引和非索引字段检索的情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、Innodb行锁的实现

【1】Innodb的行锁是通过给索引的索引项加锁来实现的

【2】Innodb按照辅助索引进行数据操作时,辅助索引和主键索引都将锁定指定的索引项

【3】通过索引进行数据检索时,Innodb才使用行级锁,否则Innodb将使用表锁

二、场景分析

环境: 创建一张表,ID为主键,Name为普通字段。下面通过实际场景进行说明。

【1】使用主键ID来进行数据检索时,其余行仍然可以操作。

session1session2
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre id = 1 for update;
±-----±-----+
| id | name  |
| 1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre id = 2 for update;
±-----±-----+
| id | name  |
| 2  | guo zi |
1 row in set(0.00sec)
【2】用非索引的字段来进行数据检索时,此时会升级为表锁,其余列就不能操作。
session1session2
--------
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre name = ‘hua zi’ for update;
±-----±-----+
| id | name  |
| 1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre name = ‘guo zi’ for update;
等待
【3】由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。应用设计的时候要注意这一点。虽然 session_2和session_1访问的是不同的记录,但因为使用了相同的索引,所以需要等待锁。
session1session2
--------
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre id = 1 and name = ‘hua zi’ for update;
±-----±-----+
|  id | name  |
|  1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre id = 1 and name = ‘guo zi’ for update;
等待
【4】当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。
session1session2
--------
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql>set autocommit=0;
Query OK,0 rows affected(0.00sec)
mysql> select * from test_lock wehre id = 1 for update;
±-----±-----+
| id | name  |
| 1  | hua zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre name = ‘guo zi’ for update;
±-----±-----+
| id | name  |
| 2  | guo zi |
1 row in set(0.00sec)
mysql> select * from test_lock wehre name = ‘hua zi’ for update;
等待

三、特殊场景

即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的,如果MySQL认为全表扫描效率更高,比如对一些很小的表,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。

在下面的例子中,检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换,但却不会使用索引,从而导致InnoDB使用表锁。通过用explain检查两条SQL的执行计划,我们可以清楚地看到了这一点。

mysql> alter table test_lock add index name(name);
Query OK, 4 rows affected (8.06 sec)
Records: 4  Duplicates: 0  Warnings: 0
mysql> explain select * from test_lock where name = 1 \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test_lock
type: ALL
possible_keys: name
key: NULL
key_len: NULL
ref: NULL
rows: 4
Extra: Using where
1 row in set (0.00 sec)
mysql> explain select * from test_lock where name = '1' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test_lock
type: ref
possible_keys: name
key: name
key_len: 23
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)

到此这篇关于mysql中Innodb 行锁实现原理的文章就介绍到这了,更多相关mysql Innodb 行锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • MySQL中对于NULL值的理解和使用教程

    MySQL中对于NULL值的理解和使用教程

    这篇文章主要介绍了MySQL中对于NULL值的理解和使用教程,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • MySQL优化案例系列-mysql分页优化

    MySQL优化案例系列-mysql分页优化

    这篇文章主要介绍了MySQL优化案例系列-mysql分页优化,需要的朋友可以参考下
    2016-08-08
  • mysql如何删除数据表和关联的数据表删除详情

    mysql如何删除数据表和关联的数据表删除详情

    这篇文章主要介绍了mysql如何删除数据表和关联的数据表删除详情,删除数据表的时候,表的定义和表中所有的数据均会被删除。因此,在进行删除操作前,最好对表中的数据做一个备份,以免造成无法挽回的后果
    2022-07-07
  • mysql中between的边界,范围说明

    mysql中between的边界,范围说明

    这篇文章主要介绍了mysql中between的边界,范围说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • MySQL对于各种锁的概念理解

    MySQL对于各种锁的概念理解

    今天小编就为大家分享一篇关于MySQL对于各种锁的概念理解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Navicat连接MySQL时出现的连接失败问题及解决

    Navicat连接MySQL时出现的连接失败问题及解决

    这篇文章主要介绍了Navicat连接MySQL时出现的连接失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • mysql 5.7.17 winx64安装配置图文教程

    mysql 5.7.17 winx64安装配置图文教程

    这篇文章主要为大家分享了mysql 5.7.17 winx64安装配置方法图文教程,感兴趣的朋友可以参考一下
    2017-01-01
  • MySQL SUM()带条件的求和方法与多条件的求和方法解读

    MySQL SUM()带条件的求和方法与多条件的求和方法解读

    这篇文章主要介绍了MySQL SUM()带条件的求和方法与多条件的求和方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • MySQL数据库修复方法(MyISAM/InnoDB)

    MySQL数据库修复方法(MyISAM/InnoDB)

    这篇文章主要为大家整理了7条修复MySQL数据库的方法,当简单的重启对数据库不起作用,或者有表崩溃时,需要的朋友可以参考下
    2014-06-06
  • MySQL中的用户创建与权限管理

    MySQL中的用户创建与权限管理

    这篇文章主要介绍了MySQL中的用户创建与权限管理,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08

最新评论