MySQL中的行级锁定示例详解

 更新时间:2019年05月08日 11:05:11   作者:诚信通天下  
这篇文章主要给大家介绍了关于MySQL中行级锁定的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

前言

锁是在执行多线程时用于强行限定资源访问的同步机制,数据库锁根据锁的粒度可分为行级锁,表级锁和页级锁

行级锁

行级锁是mysql中粒度最细的一种锁机制,表示只对当前所操作的行进行加锁,行级锁发生冲突的概率很低,其粒度最小,但是加锁的代价最大。行级锁分为共享锁和排他锁。

特点:

开销大,加锁慢,会出现死锁;锁定粒度最小,发生锁冲突的概率最大,并发性也高;

实现原理:

InnoDB行锁是通过给索引项加锁来实现的,这一点mysql和oracle不同,后者是通过在数据库中对相应的数据行加锁来实现的,InnoDB这种行级锁决定,只有通过索引条件来检索数据,才能使用行级锁,否则,直接使用表级锁。特别注意:使用行级锁一定要使用索引

举个栗子:

创建表结构

CREATE TABLE `developerinfo` (
 `userID` bigint(20) NOT NULL,
 `name` varchar(255) DEFAULT NULL,
 `passWord` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`userID`),
 KEY `PASSWORD_INDEX` (`passWord`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

INSERT INTO `developerinfo` VALUES ('1', 'liujie', '123456');
INSERT INTO `developerinfo` VALUES ('2', 'yitong', '123');
INSERT INTO `developerinfo` VALUES ('3', 'tong', '123456');

(1)通过主键索引来查询数据库使用行锁

打开三个命令行窗口进行测试

命令行窗口1 命令行窗口2 命令行窗口3

mysql> set autocommit = 0;
Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '1' for update;
+--------+--------+----------+
| userID | name | passWord |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 row in set 
|mysql> set autocommit = 0;
Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '1' for update;
等待
|mysql> set autocommit = 0;
Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '3' for update;
+--------+------+----------+
| userID | name | passWord |
+--------+------+----------+
| 3 | tong | 123456 |
+--------+------+----------+
1 row in set
|mysql> commit;
Query OK, 0 rows affected mysql> select * from developerinfo where userid = '1' for update;
+--------+--------+----------+
| userID | name | passWord |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 row in set

(2)查询非索引的字段来查询数据库使用行锁

打开两个命令行窗口进行测试

命令行窗口1 命令行窗口2

|mysql> set autocommit=0;
Query OK, 0 rows affected
mysql> select * from developerinfo where name = 'liujie' for update;
+--------+--------+----------+
userID name passWord
+--------+--------+----------+
1 liujie 123456
+--------+--------+----------+
1 row in set |mysql> set autocommit=0;
Query OK, 0 rows affected
mysql> select * from developerinfo where name = 'tong' for update;
等待|
mysql> commit;
Query OK, 0 rows affected mysql> select * from developerinfo where name = 'liujie' for update;
+--------+--------+----------+
| userID | name | passWord |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 row in set

##### (3)查询非唯一索引字段来查询数据库使用行锁锁住多行

mysql的行锁是针对索引假的锁,不是针对记录,所以可能会出现锁住不同记录的场景

打开三个命令行窗口进行测试

命令行窗口1 命令行窗口2 命令行窗口3

mysql> set autocommit=0;
Query OK, 0 rows affected
mysql> select * from developerinfo where password = '123456
' for update;
+--------+--------+----------+
| userID | name | passWord |
+--------+--------+----------+
| 1 | liujie | 123456 |
| 3 | tong | 123456 |
+--------+--------+----------+
2 rows in set mysql> set autocommit =0 ;
Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '1' for update;

等待

mysql> set autocommit = 0;
Query OK, 0 rows affected
mysql> select * from developerinfo where userid = '2
' for update;
+--------+--------+----------+
| userID | name | passWord |
+--------+--------+----------+
| 2 | yitong | 123 |
+--------+--------+----------+
1 row in set
commit; mysql> select * from developerinfo where userid = '1' for update;
+--------+--------+----------+
| userID | name | passWord |
+--------+--------+----------+
| 1 | liujie | 123456 |
+--------+--------+----------+
1 row in set

##### (4)条件中使用索引来操作检索数据库时,是否使用索引还需有mysql通过判断不同执行计划来决定,是否使用该索引,如需判定如何使用explain来判断索引,请听下回分解

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。 

相关文章

  • PowerDesigner连接MySQL数据库的详细步骤

    PowerDesigner连接MySQL数据库的详细步骤

    这篇文章主要介绍PowerDesigner连接MySQL数据库的详细步骤,文章通过图文介绍的非常详细,对大家学习PowerDesigner连接MySQL数据库有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • MySQL高级特性——数据表分区的概念及机制详解

    MySQL高级特性——数据表分区的概念及机制详解

    当数据表过大时,通过普通的查询优化技巧已经无法大幅度提升性能,此时往往需要进行分区分表优化。分区其实是将一张逻辑上统一的表在物理上划分成了多张表。分区操作对使用者而言是一个黑盒操作,但是如果你从文件系统上看,就会看到分区数据表的实际存储方式是分开的。
    2021-05-05
  • Mysql systemctl start mysqld报错的问题解决

    Mysql systemctl start mysqld报错的问题解决

    最近运行Mysql发现报错,本文就来介绍一下Mysql systemctl start mysqld报错的问题解决,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • 详解MySQL8.0 密码过期策略

    详解MySQL8.0 密码过期策略

    这篇文章主要介绍了MySQL8.0 密码过期策略的相关资料,帮助大家更好的理解和使用MySQL8.0的新功能,感兴趣的朋友可以了解下
    2020-11-11
  • mysql子查询(单行子查询,多行子查询,多列子查询)

    mysql子查询(单行子查询,多行子查询,多列子查询)

    本文主要介绍了mysql子查询(单行子查询,多行子查询,多列子查询),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • mysql 8.0.13 安装配置图文教程

    mysql 8.0.13 安装配置图文教程

    这篇文章主要介绍了mysql 8.0.13 安装配置图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • pymysql操作mysql数据库的方法

    pymysql操作mysql数据库的方法

    这篇文章主要介绍了pymysql简单操作mysql数据库的方法,主要讲的是一些基础的pymysql操作mysql数据库的方法,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2023-04-04
  • 使用python连接mysql数据库之pymysql模块的使用

    使用python连接mysql数据库之pymysql模块的使用

    这篇文章主要介绍了使用python连接mysql数据库之pymysql模块的使用,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Mysql SSH隧道连接使用的基本步骤

    Mysql SSH隧道连接使用的基本步骤

    这篇文章主要给大家介绍了关于Mysql SSH隧道连接使用的基本步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用Mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • MySQL 相关的环境变量

    MySQL 相关的环境变量

    所有使用mysqlclient客户库与服务器通信的MySQL客户使用下列环境变量
    2009-06-06

最新评论