mysql行级锁升级_mysql innodb 行级锁升级
发布日期:2021-06-24 16:12:56 浏览次数:3 分类:技术文章

本文共 1201 字,大约阅读时间需要 4 分钟。

创建数据表test,表定义如下所示:

CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(20) NOT NULL,

PRIMARY KEY (`id`),

KEY `idx_name` (`name`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

创建测试数据集,插入SQL语句如下所示:

insert into test value(null,'aaa'), (null,'aaa'), (null,'aaa'), (null,'aaa'), (null,'aaa'), (null,'aaa');

insert into test value(null,'bbb'), (null,'ccc'), (null,'ddd'), (null,'eee'), (null,'fff'), (null,'ggg'), (null,'hhh'), (null,'iii'), (null,'jjj'), (null,'kkk'), (null,'lll'), (null,'mmm');

测试

测试过程从三个方面测试:首先测试行锁的有效性,即测试索引项的行锁操作;其次测试行锁的升级,测试索引项操作的锁等待;最后,减少操作索引项数据,查看行锁升级的临界值。

测试前,首先建立两个mysql连接,并且将mysql的autocommit设置为0,然后进行一下各个测试。执行的sql语句为:

set autocommit=0;

1、行锁测试

在mysql客户端1上执行以下操作:

delete from test where name='ccc';

在mysql客户端2上执行以下操作:

insert into test values(null,’nnn’);

在客户端1没有提交和回滚操作之前,在客户端2上执行插入操作成功。由此可见,mysql在操作时的确是使用了行级锁。

验证结束之后,回滚操作,分别在两个客户端上执行回滚操作:

rollback;

2、行锁升级测试

在mysql客户端1上执行以下操作:

delete from test where name='aaa';

在mysql客户端2上执行以下操作:

insert into test values(null,’nnn’);

客户端1没有提交和回滚的情况下,客户端2始终处于锁等待状态。只有当在客户端1上执行回滚操作或者提交操作后,客户端2上的操作才能执行。从行锁的理论来看,这是不符的。但是当操作的数据占整个数据的比例较大时,行锁将会升级,导致其他操作处于锁等待状态。

3、行锁升级临界测试

经测试,当删除数据为5条时有锁等待4条时没有。而如果name字段上没有索引则为表锁。

转载地址:https://blog.csdn.net/weixin_33744799/article/details/113349699 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c 调用mysql密码为空_C语言连MySQL - osc_srnunz15的个人空间 - OSCHINA - 中文开源技术交流社区...
下一篇:vb 读取mysql所有表名_vb怎么列举出一个mdb数据库里面所有表名?

发表评论

最新留言

不错!
[***.144.177.141]2024年04月17日 15时04分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章