由于业务需要增加字段并对历史数据进行更新,但更新旧数据的操作不能引起锁表行为。如果采用索引方式,一般是会引起行锁,影响不大,但是如果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成功,说明没有产生锁表
结论:当查询条件命中分区或者直接指定分区进行更新时,不会引起表锁。