`
shifulong
  • 浏览: 59221 次
  • 性别: 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 SELECT FOR UPDATE语句使用示例

    MySQL中的`SELECT FOR UPDATE`语句是在事务处理中用于实现数据锁定的一种机制,它主要用于解决多用户并发操作时的数据一致性问题。在InnoDB存储引擎下,MySQL默认的事务隔离级别是`REPEATABLE READ`,这允许事务在...

    MySQL锁类型以及子查询锁表问题、解锁1

    在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...

    mysql事务select for update及数据的一致性处理讲解

    值得注意的是,InnoDB的行级锁(Row-Level Lock)在未明确指定主键时可能会降级为表级锁(Table Lock),这会导致所有对该表的读写操作都被阻塞,直到事务结束。因此,为了最小化锁定范围,务必在`SELECT ... FOR ...

    MySQL悲观锁总结和实践

    FOR UPDATE 的 Row Lock 与 Table Lock 在使用`SELECT ... FOR UPDATE`时,需要注意锁的级别。MySQL InnoDB 默认使用行级锁(Row-Level Lock),但在某些情况下可能会使用表级锁(Table Lock)。 - **行级锁(Row...

    mysql语法文档

    mysql语法文档 ... * my_ulonglong mysql_affected_rows(MYSQL *mysql):返回最后一个update、delete、insert操作影响的记录数 * my_ulonglong mysql_num_rows(MYSQL_RES *res):返回查询结果的行数

    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中文参考手册.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.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 Read Lock)和表独占写锁(Table Write Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会...

    Qt单例模式实现Mysql数据库的链接,增加,删除,修改,查询

    QList, QVariant&gt;&gt; MySqlConnection::selectData(const QString& table, const QString& condition = "") { QSqlQuery query; query.prepare("SELECT * FROM " + table + (condition.isEmpty() ? "" : " WHERE " +...

    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. 复制...

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

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

    MySQL status解读.zip_MYSQL

    7. **Innodb_row_lock_waits** 和 **Innodb_row_lock_time_avg**:分别表示行锁等待次数和平均等待时间,过多的等待可能意味着并发控制问题。 8. **Slow_queries**:执行时间超过long_query_time秒的慢查询数量,...

    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. 使你的数据尽可能小...

Global site tag (gtag.js) - Google Analytics