当前位置:   article > 正文

关于mysql中的行锁和表锁_什么时候导致行锁什么时候导致表锁

什么时候导致行锁什么时候导致表锁

在使用mysql数据库的时候我们会遇到一个锁表的问题,当同一个表在进行update操作的时候,还没有操作完,之后又有请求操作该表的时候,表会进行锁定,锁定的方式呢就有两种分为行锁和表锁

 顾名思义,

行锁就是锁一行的数据

表锁就是锁了整个表的数据

那么什么情况下是行锁,什么情况下是表锁呢

行锁:是在表有索引的情况下

表锁:是在表没有索引的情况下。

表锁演示(无索引)

Session1:

mysql> select * from index_test;
+------+-------------+
| id   | name        |
+------+-------------+
|    1 | 张三  | 
|    2 | 李四 | 
|    3 | 王五 | 
+------+-------------+

mysql> select * from index_test where id = 2 for update;
+------+------------+
| id   | name       |
+------+------------+
|    2 | 李四 | 
+------+------------+

Session2:

mysql> update index_test set name='刘六' where id = 1 ;
处于等待状态....

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

mysql> update index_test set name='刘六' where id = 1 ;
Query OK, 1 row affected (5.11 sec)
Rows matched: 1  Changed: 1  Warnings: 0

实验结果是:我在session1的for update 操作看似只锁定ID为2的行其实锁定了全表

,以至于后面session2的对ID为1的行update 需要等待Session1锁的释放。

行锁演示(索引为id)

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

mysql> select * from index_test where id = 2 for update;
+------+------------+
| id   | name       |
+------+------------+
|    2 | 李四 | 
+------+------------+

Session2:

mysql> update index_test set name='钱7' 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 | 钱7 | 
+------+---------------+
1 row in set (0.00 sec)

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

 

文本转载自:https://blog.csdn.net/songwei128/article/details/43418343

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/685474
推荐阅读
相关标签
  

闽ICP备14008679号