常规锁设计
分区表通过表锁+分区锁两重设计,在表和分区上分别施加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 |
| REBUILD INDEX PARTITION | 1-5 | 1-1-5 |
| 其他分区表DDL | 8-8 | 8-8-8 |