`
shifulong
  • 浏览: 56702 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql select for update, row lock, table lock

    博客分类:
  • db
阅读更多

mysql select for update, row lock, table lock

 

一些前置条件

打开连个控制台模拟

 

mysql> show create table table_test;
| Table      | Create Table                                                                
| table_test | CREATE TABLE `table_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_index` int(11) DEFAULT '0',
  `id_no_index` int(11) DEFAULT '0',
  `common` int(11) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index_id_index` (`id_index`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 |

 

mysql> select * from table_test;
+----+----------+-------------+--------+
| id | id_index | id_no_index | common |
+----+----------+-------------+--------+
|  1 |        0 |           0 |      1 |
|  2 |        0 |           0 |      2 |
|  3 |        0 |           0 |      3 |
|  4 |        0 |           0 |      4 |
|  5 |        0 |           0 |      5 |
|  6 |        1 |           1 |      5 |
|  7 |        1 |           1 |      6 |
|  8 |        1 |           1 |      7 |
|  9 |        1 |           1 |      8 |
| 10 |        1 |           1 |      9 |
+----+----------+-------------+--------+
10 rows in set (0.00 sec)

 

mysql> set autocommit = 0;

 

 

索引字段

session1

mysql> begin;
mysql> select * from table_test where id_index=1 for update;

 

session2

mysql> select * from table_test where id_index=0 for update;

 正常执行

 

mysql> select * from table_test where id_index=1 for update;

阻塞,当session1执行 "commit" or "rollback" 释放锁,session2继续执行

 

结论:有索引的字段用row lock

 

 

无索引字段

session1

mysql> begin;
mysql> select * from table_test where id_no_index=1 for update;

 

session2

select * from table_test where id_no_index=0 for update;

此时会阻塞,当session1执行 "commit" or "rollback" 释放锁,session2继续执行

 

结论:无索引的字段用table lock

 

范围条件

mysql> select * from table_test where id>8 for update;
+----+----------+-------------+--------+
| id | id_index | id_no_index | common |
+----+----------+-------------+--------+
|  9 |        1 |           1 |      8 |
| 10 |        1 |           1 |      9 |
+----+----------+-------------+--------+

mysql 会将这两条记录加锁

也会对大于10的加锁,这种锁机制就是所谓的间隙锁(Next-Key 锁)

 

session1

mysql> begin;
mysql> select * from table_test where id_index>8 for update;

 

session2

mysql> select * from table_test where id_index<8 for update;

正常执行

mysql> insert into table_test(id,id_index,id_no_index,common) values (11,1,1,10);

此时会阻塞,当session1执行 "commit" or "rollback" 释放锁,session2继续执行

 

 

 InnoDB行锁和表锁的分析

http://haicang.blog.51cto.com/2590303/1085388

分享到:
评论

相关推荐

    MySQL中文参考手册.chm

    5.1 MySQL对ANSI SQL92 的扩充 5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务...

    MYSQL

    5.1 MySQL对ANSI SQL92 的扩充 5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务...

    MySQL中文参考手册

    + 5.4.2 SELECT INTO TABLE + 5.4.3 事务(Transactions) + 5.4.4 存储过程和触发器 + 5.4.5 外键(Foreign Keys) # 5.4.5.1 不使用外键的理由 + 5.4.6 视图(Views) + 5.4.7 '--'作为一个 注解的开始 o 5.5 ...

    mysql数据库的基本操作语法

    MySQL中外键的table的外键引用列可以插入数据可以为null,不参照主表的数据。 使用子查询插入数据 insert into temp(name) select name from classes; 多行插入 insert into temp values(null, ‘jack’, 22), ...

    MySQL 5.1中文手冊

    LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制...

    MySQL 5.1官方简体中文参考手册

    7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它优化技巧 7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4...

    MySQL 5.1参考手册

    MySQL 5.1参考手册.chm 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL...

    MySQL 5.1参考手册中文版

    目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要... LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET ...

    MySQL 5.1参考手册 (中文版)

    LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制...

    MYSQL中文手册

    1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 ...

    mysql5.1中文手册

    UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它优化技巧 7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小...

    mysql官方中文参考手册

    MySQL 5.1参考手册 目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. ...

    MySQL5.1参考手册官方简体中文版

    MySQL 5.1参考手册 这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。 This translation was done by MySQL ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    主要包括select, update, insert, alter, index, delete, all其中all包括所有权限。  授予实体权限 用法:grant 实体权限1[,实体权限2]… on 表名 to用户名1[,用户名2]…. 例子:  实体权限回收 用法:revoke ...

Global site tag (gtag.js) - Google Analytics