MySQL高级——MySql行锁升级为表锁案例

一、建表SQL

1、创建test_innodb_lock表的SQL

CREATE TABLE test_innodb_lock (
a INT(11),
b VARCHAR(16)
)ENGINE=INNODB;

INSERT INTO test_innodb_lock VALUES(1,'b2');
INSERT INTO test_innodb_lock VALUES(3,'3');
INSERT INTO test_innodb_lock VALUES(4,'4000');
INSERT INTO test_innodb_lock VALUES(5,'5000');
INSERT INTO test_innodb_lock VALUES(6,'6000');
INSERT INTO test_innodb_lock VALUES(7,'7000');
INSERT INTO test_innodb_lock VALUES(8,'8000');
INSERT INTO test_innodb_lock VALUES(9,'9000');
INSERT INTO test_innodb_lock VALUES(1,'b1');

2、创建test_innodb_lock表a字段索引

CREATE INDEX test_innodb_a_ind ON test_innodb_lock(a);

3、创建test_innodb_lock表b字段索引

CREATE INDEX test_innodb_lock_b_ind ON test_innodb_lock(b);

4、执行查询语句

SELECT * FROM test_innodb_lock;

在这里插入图片描述

二、MySql引行锁升级为表锁基本演示

1、 在客户端1 和客户端2中都手动关闭自动提交功能

#关闭mysql自动提交
SET autocommit=0;
#开启mysql自动提交
SET autocommit=1;

在这里插入图片描述
2、在客户端1中更新a=4的数据但不手动提交,然后在客户端2中更新a=8的数据也不手动提交。查看客户端1和客户端2是否能更新成功。

#在客户端1中执行
UPDATE test_innodb_lock SET b='4001' WHERE a =4;
#然后在客户端2中执行
UPDATE test_innodb_lock SET b='8001' WHERE a =8;

在这里插入图片描述

  • 结论:在客户端1中更新a=4的数据但不手动提交,然后在客户端2中更新a=8的数据也不手动提交。客户端1和客户端2都能更新数据成功。

3、在客户端1中更新b=4000的数据(b字段是varchar类型,但是不加单引号)但不手动提交,然后在客户端2中更新a=9的数据(b字段是varchar类型,但是加单引号)也不手动提交。查看客户端1和客户端2是否都能更新数据成功。

#在客户端1中执行
UPDATE test_innodb_lock SET a=41 WHERE b=4000;
#然后在客户端2中执行
UPDATE test_innodb_lock SET b='9002' WHERE a=9;

在这里插入图片描述

  • 结论:在客户端1中更新b=4000的数据(b字段是varchar类型,但是不加单引号)但不手动提交,由于在column字段b上面建了索引,如果没有正常使用,会导致行锁变表锁比如没加单引号导致索引失效,行锁变表锁,虽然会更新成功,但是在客户端2中更新数据会被阻塞。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:白松林 返回首页