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行锁和表锁的分析
相关推荐
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 事务...
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 事务...
+ 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中外键的table的外键引用列可以插入数据可以为null,不参照主表的数据。 使用子查询插入数据 insert into temp(name) select name from classes; 多行插入 insert into temp values(null, ‘jack’, 22), ...
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. 复制...
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参考手册.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...
目录 前言 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 ...
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. 复制...
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的差别 ...
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 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. ...
MySQL 5.1参考手册 这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。 This translation was done by MySQL ...
主要包括select, update, insert, alter, index, delete, all其中all包括所有权限。 授予实体权限 用法:grant 实体权限1[,实体权限2]… on 表名 to用户名1[,用户名2]…. 例子: 实体权限回收 用法:revoke ...