赞
踩
由于业务需要增加字段并对历史数据进行更新,但更新旧数据的操作不能引起锁表行为。如果采用索引方式,一般是会引起行锁,影响不大,但是如果update条件中不包含索引,则会引起锁表。下面看下表分区后对于锁的特点。
1.建表语句,按时间分月进行分区(to_days函数得到是从0年开始到现在的天数)
- CREATE table a (
- id BIGINT(20) not null auto_increment,
- version SMALLINT(6),
- ctime datetime,
- PRIMARY KEY (id,ctime) using BTREE
- ) ENGINE=INNODB
- PARTITION by RANGE (TO_DAYS(ctime))
- (PARTITION p201904 VALUES less than (737545) ENGINE=INNODB,
- PARTITION p201905 VALUES less than (737576) ENGINE=INNODB);
- INSERT INTO `a` (`version`, `ctime`) VALUES (1, '2019-4-10 11:47:29');
- INSERT INTO `a` (`version`, `ctime`) VALUES (2, '2019-4-19 14:40:25');
- INSERT INTO `a` (`version`, `ctime`) VALUES (3, '2019-5-23 11:47:39');
- INSERT INTO `a` (`version`, `ctime`) VALUES (4, '2019-5-23 14:40:41');
2.测试情况1:按照分区条件更新
打开两个命令窗口进行测试,测试语句如下,窗口1输入update语句先不commit,窗口2进行update并commit成功,说明没有产生锁表
3.测试情况2:直接指定更新某个区
打开两个命令窗口进行测试,测试语句如下,窗口1输入update语句先不commit,窗口2进行update并commit成功,说明没有产生锁表
结论:当查询条件命中分区或者直接指定分区进行更新时,不会引起表锁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。