表结构:

id:自增主键,a:无索引,b:普通索引

CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`a` int(4) NOT NULL DEFAULT '0',

`b` int(4) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`),

KEY `b` (`b`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

等值查询加锁

主键索引字段加锁查询

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where id = 1 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 1 | 2 | 1 |

+----+---+---+

1 row in set (0.00 sec)

窗口B:

mysql> update test set a = 11 where id = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 11 where id = 2;(正常执行)

证明根据主键索引字段加锁查询,会锁住该条数据(记录锁)。

普通索引字段加锁查询

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where b = 1 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 1 | 1 | 1 |

| 3 | 3 | 1 |

| 5 | 5 | 1 |

+----+---+---+

3 rows in set (0.00 sec)

窗口B:

mysql> update test set a = 11 where b = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 11 where id = 3;(被阻塞,等待窗口A中commit后才执行)

mysql> insert into test(a,b) value(1,1);(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 11 where id = 2;(正常执行)

mysql> insert into test(a,b) value(1,2);(正常执行)

证明根据普通索引字段加锁查询,会锁住符合该条件的所有记录包括不存在的,因此得出锁的是索引,而非数据本身。

无索引字段加锁查询

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where a = 1 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 1 | 1 | 1 |

+----+---+---+

1 row in set (0.00 sec)

窗口B:

mysql> update test set a = 22 where id = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where a = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where b = 1;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where a = 2;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where b = 2;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 22 where id = 2;(被阻塞,等待窗口A中commit后才执行)

mysql> insert into test(a,b) value(22,22);(被阻塞,等待窗口A中commit后才执行)

证明根据无索引字段加锁查询,会锁住整张表,表现形式类似于表锁。

范围查询加锁

窗口A:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test where id > 3 and id < 6 for update;

+----+---+---+

| id | a | b |

+----+---+---+

| 5 | 5 | 5 |

+----+---+---+

1 row in set (0.00 sec)

窗口B:

mysql> insert into test(id,a,b) value(4,4,4);(被阻塞,等待窗口A中commit后才执行)

mysql> insert into test(id,a,b) value(6,6,6);(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 77 where id = 7;(被阻塞,等待窗口A中commit后才执行)

mysql> update test set a = 33 where id = 3;(正常执行)

mysql> update test set a = 22 where id=8;(正常执行)

证明锁的范围为**(3,7],既锁住了记录本身(记录锁),也锁住了索引之间的间隙(间隙锁),而且把索引后相邻的两个记录也锁住了(临键锁)**。

通过无索引字段范围查询时,同样是锁住整张表。

mysql 锁 代码_MySQL中的锁实例相关推荐

  1. mysql某个表被行锁了_MySQL中的锁(表锁、行锁)

    锁是计算机协调多个进程或纯线程并发访问某一资源的机制.在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所在有数 ...

  2. mysql 并发 锁表_MySQL中的锁(表锁、行锁) 并发控制锁

    https://github.com/MrLining/mysql/wiki/MySQL%E4%B8%AD%E7%9A%84%E9%94%81%EF%BC%88%E8%A1%A8%E9%94%81%E ...

  3. 阿里云mysql不让锁表_MySQL中InnoDB锁不住表的原因

    MySQL中InnoDB锁不住表是因为如下两个参数的设置: mysql> show variables like '%timeout%'; +-------------------------- ...

  4. mysql 存储过程代码_mysql存储过程语法与实例

    大纲: 创建.删除.调用. 声明变量.变量赋值.存储过程的入参 声明游标 声明异常处理器 判断 循环 使用心得 mybatis调用存储过程 一.创建.删除.调用 创建 DELIMITER $$ #修改 ...

  5. mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?

    乐观锁和悲观锁相信大家都是知道的,这是java中的基础知识,今天我们就来看看它们两者该如何使用代码实现吧. 乐观锁实现 1).表设计 表task,分别有三个字段id,value.version 2). ...

  6. Java中的各种锁和数据库中的锁

    Java中的锁 公平和非公平锁:公平锁是指多个线程按照申请锁的顺序来获取锁非公平锁即打破这个顺序,后来的线程也可以提前获取锁. 在ReentrantLock中可以通过改变构造方法参数,变化锁.但是在s ...

  7. mysql中写锁定实例_MySQL中的锁

    我学习MySQL是半路出家,刚开始接触的时候,只知道数据库的增删改查和事务,直到有一天数据库突然爆出(1205, 'Lock wait timeout exceeded; try restarting ...

  8. mysql乐观锁实现_mysql实现乐观锁实例(demo)

    本文参考:https://blog.csdn.net/seapeak007/article/details/53490156,感谢老铁的辛苦付出. 乐观锁介绍: 乐观锁( Optimistic Loc ...

  9. mysql 互斥_Mysql 中互斥锁的使用

    本文介绍如在在多线程mysql代码开发中使用互斥锁. mysql自己对c++的mutex又进行了一次封装,封装的代码可以在include/mysql/psi/mysql_thread.h  中找到. ...

最新文章

  1. TensorFlow固化模型+打包程序+web API
  2. 无线通信频率分配表(详细)
  3. 组合,多态,封装, @property
  4. 从容稳进,高通正扎实推进5G
  5. 线性代数导论3——乘法与逆矩阵
  6. 阿里面试,为什么Kafka不支持读写分离
  7. 码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达
  8. python处理shp和栅格文件的相关库shapefile、gdal等
  9. MySQL安装错误——Access denied for user 'root'@'localhost' (using password: YES)
  10. python 错误信息是:sudo :apt-get:command not found
  11. redis数据类型之List
  12. 前端常见面试题-css篇
  13. kernel input device
  14. linux recovery模式是什么,recovery.img是什么
  15. 我学炒外汇 第二十二篇实战心得
  16. Unity 面试题汇总(五)性能优化知识点相关
  17. 指静脉识别标准实施1个月 有何影响?
  18. 如何在 JupyterLab 中把 ipykernel 切换到不同的 conda 虚拟环境?
  19. IT码农进入日企之路——模拟试题
  20. ORA-19706和_external_scn_rejection_threshold_hours的前世今生

热门文章

  1. 支持在iPad中播放的HTML5视频网站推荐
  2. Async Await
  3. 实现小程序canvas拖拽功能
  4. html5新特性:异步上传文件
  5. 纯css隐藏移动端滚动条解决方案(ios上流畅滑动)
  6. 我的GMAIL下蛋了,要的请留下姓,名和email!!
  7. Python 06-字典
  8. 将 JAR 转为 EXE – JSMOOTH 的使用教程(第二期)(转载)
  9. Android programming on Mac 之安装Eclipse
  10. SQL 性能不佳的几个原因