
# 常规锁设计
分区表通过表锁+分区锁两重设计，在表和分区上分别施加不同级别的常规锁，保证DQL、DML以及DDL并发过程中的合理行为控制。不同级别锁的相容行为如[表1]所示，表中标记为"√"的两种常规锁互不阻塞，可以并行。
 表1常规锁相容行为 
|        常规锁相容行为         | 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       | ×            | ×         | ×             | ×                      | ×     | ×                   | ×         | ×                |
   
分区表的不同业务最终都是作用于目标分区上，数据库会给分区表和目标分区施加不同级别的表锁+分区锁，来控制并发行为。[表2]给出了不同业务的锁粒度控制。其中数字1\~8分别代表[表1]给出的ACCESS_SHARE、ROW_SHARE、ROW_EXCLUSIVE、SHARE_UPDATE_EXCLUSIVE、SHARE、SHARE_ROW_EXCLUSIVE、EXCLUSIVE、ACCESS_EXCLUSIVE这8种级别的常规锁。
 表2分区表业务锁粒度 
|                                  业务模型                                  | 一级分区表锁级别(表锁+分区锁) |                                               二级分区表锁级别(表锁+一级分区锁+二级分区锁)                                                |
|:----------------------------------------------------------------------:|:----------------:|:---------------------------------------------------------------------------------------------------------------------:|
|                                 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                                                         |
   
如果业务执行施加的表锁和分区锁均满足[表1]，则可以支持业务并行操作，如果表锁和分区锁有任一不相容，则二者不支持业务并行。
