• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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来判断索引,请听下回分解

    总结

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

    您可能感兴趣的文章:
    • 关于MySQL死锁问题的深入分析
    • MySql 索引、锁、事务知识点小结
    • mysql共享锁与排他锁用法实例分析
    • MySQL全局锁和表锁的深入理解
    • MySQL锁的知识点总结
    上一篇:MySQL InnoDB中的锁机制深入讲解
    下一篇:mysql-8.0.15-winx64 使用zip包进行安装及服务启动后立即关闭问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL中的行级锁定示例详解 MySQL,中的,行级,锁定,示例,