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行锁和表锁的分析
相关推荐
MySQL中的`SELECT FOR UPDATE`语句是在事务处理中用于实现数据锁定的一种机制,它主要用于解决多用户并发操作时的数据一致性问题。在InnoDB存储引擎下,MySQL默认的事务隔离级别是`REPEATABLE READ`,这允许事务在...
在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...
值得注意的是,InnoDB的行级锁(Row-Level Lock)在未明确指定主键时可能会降级为表级锁(Table Lock),这会导致所有对该表的读写操作都被阻塞,直到事务结束。因此,为了最小化锁定范围,务必在`SELECT ... FOR ...
FOR UPDATE 的 Row Lock 与 Table Lock 在使用`SELECT ... FOR UPDATE`时,需要注意锁的级别。MySQL InnoDB 默认使用行级锁(Row-Level Lock),但在某些情况下可能会使用表级锁(Table Lock)。 - **行级锁(Row...
mysql语法文档 ... * my_ulonglong mysql_affected_rows(MYSQL *mysql):返回最后一个update、delete、insert操作影响的记录数 * my_ulonglong mysql_num_rows(MYSQL_RES *res):返回查询结果的行数
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 Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会...
QList, QVariant>> MySqlConnection::selectData(const QString& table, const QString& condition = "") { QSqlQuery query; query.prepare("SELECT * FROM " + table + (condition.isEmpty() ? "" : " WHERE " +...
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. 复制...
MySQL 5.1参考手册 这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。 This translation was done by MySQL ...
7. **Innodb_row_lock_waits** 和 **Innodb_row_lock_time_avg**:分别表示行锁等待次数和平均等待时间,过多的等待可能意味着并发控制问题。 8. **Slow_queries**:执行时间超过long_query_time秒的慢查询数量,...
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. 使你的数据尽可能小...