wyy123

创建数据表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字段上没有索引则为表锁。

 

分类:

技术点:

相关文章:

  • 2021-07-14
  • 2021-12-15
  • 2021-07-02
  • 2022-01-13
  • 2022-02-05
  • 2022-01-11
  • 2022-02-25
猜你喜欢
  • 2022-01-09
  • 2021-11-22
  • 2022-12-23
  • 2021-11-06
  • 2022-12-23
  • 2021-06-21
  • 2021-08-30
相关资源
相似解决方案