常规锁设计
分区表通过表锁+分区锁两重设计,在表和分区上分别施加8个不同级别的常规锁,来保证DQL、DML、DDL并发过程中的合理行为控制。下表给出了不同级别锁的互斥行为,标记为√的两种常规锁互不阻塞,可以并行。
- |
ACCESS_SHARE |
ROW_SHARE |
ROW_EXCLUSIVE |
SHARE_UPDATE_EXCLUSIVE |
SHARE |
SHARE_ROW_EXCLUSIVE |
EXCLUSIVE |
ACCESS_EXCLUSIVE |
---|---|---|---|---|---|---|---|---|
ACCESS_SHARE |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
× |
ROW_SHARE |
√ |
√ |
√ |
√ |
√ |
√ |
× |
× |
ROW_EXCLUSIVE |
√ |
√ |
√ |
√ |
× |
× |
× |
× |
SHARE_UPDATE_EXCLUSIVE |
√ |
√ |
√ |
× |
× |
× |
× |
× |
SHARE |
√ |
√ |
× |
× |
√ |
× |
× |
× |
SHARE_ROW_EXCLUSIVE |
√ |
√ |
× |
× |
× |
× |
× |
× |
EXCLUSIVE |
√ |
× |
× |
× |
× |
× |
× |
× |
ACCESS_EXCLUSIVE |
× |
× |
× |
× |
× |
× |
× |
× |
分区表的不同业务最终都是作用于目标分区上,数据库会给分区表和目标分区施加不同级别的表锁+分区锁,来控制并发行为。下表给出了不同业务的锁粒度控制。其中数字1~8代表上表给出的8种级别常规锁。
业务模型 |
一级分区表锁级别(表锁+分区锁) |
二级分区表锁级别(表锁+一级分区锁+二级分区锁) |
---|---|---|
SELECT |
1-1 |
1-1-1 |
SELECT FOR UPDATE |
2-2 |
2-2-2 |
DML业务,包括INSERT、UPDATE、DELETE、UPSERT、MERGE INTO、COPY |
3-3 |
3-3-3 |
分区DDL,包括ADD、DROP、EXCHANGE、TRUNCATE、SPLIT、MERGE、MOVE、RENAME;打开/关闭分区自动扩展 |
4-8 |
4-8-8(作用二级分区表的一级分区) 4-4-8 (作用二级分区表的二级分区) |
CREATE INDEX(非分类索引)、REBUILD INDEX |
5-5 |
5-5-5 |
CREATE INDEX(分类索引) |
3-5 |
3-3-5 |
REBUILD INDEX PARTITION |
1-5 |
1-5-5 |
ANALYZE、VACUUM |
4-4 |
4-4-4 |
其他分区表DDL |
8-8 |
8-8-8 |