`

mysql行锁和表锁

 
阅读更多

 

在调用存储过程中,就会涉及到表锁,行锁这一概念:所谓区别:有索引的时候就是行锁,没有索引的时候就是表索。

innodb 的行锁是在有索引的情况下,没有索引的表是锁定全表的.

表锁演示(无索引)

Session1:

mysql> set autocommit=0;

mysql> select * from innodb_test;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | woshiceshi  | 
|    2 | woshiceshi2 | 
|    3 | woshiceshi3 | 
+------+-------------+

mysql> select * from innodb_test where id = 2 for update;
+------+------------+
| id   | name       |
+------+------------+
|    2 | woshiceshi2 | 
+------+------------+

Session2:

mysql> update innodb_test set name='sjis' where id = 1 ;
处于等待状态....

再回到session1 commit以后,session2就出来结果了(锁定了8秒,过了8秒左右才去session1提交)。

mysql> update innodb_test set name='sjis' where id = 1 ;
Query OK, 1 row affected (8.11 sec)
Rows matched: 1  Changed: 1  Warnings: 0

实验结果是:我在session1的for update 操作看似只锁定ID为2的行其实锁定了全表,以至于后面session2的对ID为1的行update 需要等待Session1锁的释放。

行锁演示(索引为ID)

Session1:
mysql> alter table innodb_test add index idx_id(id);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from innodb_test where id = 2 for update;
+------+------------+
| id   | name       |
+------+------------+
|    2 | woshiceshi2 | 
+------+------------+

Session2:

mysql> update innodb_test set name='wohaishiceshi' where id = 1 ;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from innodb_test where id = 1;           
+------+---------------+
| id   | name          |
+------+---------------+
|    1 | wohaishiceshi | 
+------+---------------+
1 row in set (0.00 sec)

实验结果:这次的锁定是锁定的行,所以没有被锁定的行(ID不为2的行)可以进行update..

分享到:
评论

相关推荐

    MySQL 行锁和表锁的含义及区别详解

    页锁的开销和加锁时间介于表锁和行锁之间,其并发度也相应介于两者之间。MySQL中,InnoDB引擎不直接支持页锁,但在某些特定情况下,如数据页分裂等内部操作中可能会隐式使用。 4. **锁的比较** - **并发度**:行锁...

    数据库锁(行锁,表锁,共享锁,排他锁)脏读、不可重复读、幻读和事物隔离级别

    在MySQL的InnoDB引擎中,支持行级锁(Row Locks)、表级锁(Table Locks),以及共享锁(Shared Locks)和排他锁(Exclusive Locks)。行级锁通过索引实现,如果SQL语句没有利用索引,则会升级为表锁。 行锁具有...

    MySQL锁机制_管理 .mht

    MySQL锁机制_管理(并发锁,行锁,表锁,预加锁,全局锁等等).mht

    乐观锁悲观锁及事务及行锁表锁

    mysql锁,与事务,以及各种级别锁,和乐观锁悲观锁的研究使用

    61 表锁和行锁互相之间的关系以及互斥规则是什么呢?l.pdf

    MySQL中表锁和行锁的互斥规则是一门较为复杂但十分重要的知识,尤其在数据库并发控制的场景下,理解这些规则能够帮助开发者和数据库管理员更好地设计和管理数据库应用。本篇文章将详细地阐述表锁和行锁在MySQL中的...

    wangzaolin#SoftwareTestSource#5.1.6-mysql常用查询命令2

    1、连接数查询 2、行锁和表锁查询 3、慢sql查询

    Mysql 锁机制的详细说明

    - 按照锁的粒度:行锁、表锁、页锁(MySQL 中最常见的为行锁和表锁) - 按照锁的使用方式:共享锁(读锁)、排他锁(写锁) 2. 概念: - 行锁:只锁定单个数据行,允许其他事务同时读取同一表的其他行,减少了锁...

    MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    本文主要讨论了MySQL中的五种锁:表锁、行锁、共享锁、排它锁和间隙锁。 1. 表锁:表锁是MySQL中最基础的锁类型,主要在MyISAM存储引擎中使用。表锁分为两种模式:读锁(Table Read Lock)和写锁(Table Write Lock...

    mysql 锁表锁行语句分享(MySQL事务处理)

    在标题和描述中提到的“mysql 锁表锁行语句分享”是关于如何在MySQL中使用事务来锁定特定行数据,确保在操作期间不会被其他并发事务访问。 在给出的代码示例中,首先通过`set autocommit=0`关闭了自动提交模式,这...

    mysql高级视频教程百度云(2019).txt

    59.MySQL高级_索引失效行锁变表锁.avi 58.MySQL高级_行锁演示答疑补充.avi 57.MySQL高级_行锁案例讲解.avi 56.MySQL高级_行锁理论.avi 55.MySQL高级_读锁案例讲解2.avi 54.MySQL高级_读锁案例讲解.avi ...

    2021年MySQL高级教程视频.rar

    20.MySQL高级锁InnoDB行锁行锁升级为表锁.avi 21.MySQL高级锁InnoDB行锁间隙锁危害.avi 22.MySQL高级锁InnoDB行锁争用情况查看.avi 23.MySQL高级锁InnoDB行锁总结.avi 24.MySQL高级SQL技巧SQL执行顺序及正则表达式....

    MySQL锁的详细介绍

    * 页级锁:锁定相邻的一组记录,锁定粒度界于表锁和行锁之间,开销和加锁时间界于表锁和行 锁之间,并发度一般。应用在 BDB 存储引擎中。 1.2 从操作的类型可分为读锁和写锁。 * 读锁(S 锁):共享锁,针对同一份...

    尚硅谷Java视频教程_MySQL高级视频

    · 00.尚硅谷_MySQL高级_源码...尚硅谷_MySQL高级_索引失效行锁变表锁 · 60.尚硅谷_MySQL高级_间隙锁危害 · 61.尚硅谷_MySQL高级_如何锁定一行 · 62.尚硅谷_MySQL高级_行锁总结 · 63.尚硅谷_MySQL高级_主从复制

    全局锁、表锁、行锁.doc

    全局锁、表锁和行锁是MySQL中常见的三种锁定级别,分别在不同场景下使用。 全局锁(Global Lock)是指对整个数据库实例加锁,最常用的实现方式是`FLUSH TABLES WITH READ LOCK`(FTWRL)。使用全局锁后,数据库将...

    mysql insert锁机制1

    InnoDB同时支持行锁和表锁,而MyISAM只支持表锁。 3. 事务隔离级别:MySQL提供了四种隔离级别,分别是READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。文中提到的是REPEATABLE READ级别,该级别...

    MySQL中如何处理并发写入问题?

    除了行锁外,MySQL 还提供了表锁(Table Locking)和页锁(Page Locking)等级别的锁。 行锁是一种粒度较小的锁机制,它可以锁定单个行的数据,从而避免了并发写入冲突。表锁是一种粒度较大的锁机制,它可以锁定...

Global site tag (gtag.js) - Google Analytics