锁定与并行控制
为了提供并行控制并防止数据访问不受控,数据库管理器将锁定缓冲池、表、数据分区、表块或表行。
锁定使数据库管理器资源与应用程序(称为锁定所有者)相关联,以便控制其他应用程序访问同一资源的方式。
数据库管理器根据下列各项来适当地使用行级别锁定或表级别锁定:
- 在预编译时或者将应用程序与数据库绑定时指定的隔离级别。 隔离级别可以是下列其中一项:
- 未落实的读 (UR)
- 游标稳定性 (CS)
- 读稳定性 (RS)
- 可重复的读 (RR)
- 优化器选择的存取方案。 表扫描、索引扫描和其他数据访问方法都需要不同的数据访问类型。
- 表的 LOCKSIZE 属性。 ALTER TABLE 语句的 LOCKSIZE 子句指示访问表时使用的锁定的粒度。 选项是:ROW(表示行锁定)、TABLE(表示表锁定)或 BLOCKINSERT(仅表示对多维集群 (MDC) 表的块锁定)。 对 MDC 表使用 BLOCKINSERT 子句时,除了执行块级锁定的插入操作以外,将执行行级别锁定。 使用 ALTER TABLE ...当事务将在分离的单元格中执行大型插入时,针对 MDC 表的 LOCKSIZE BLOCKKINSERT 语句。 使用 ALTER TABLE ...只读表的 LOCKSIZE TABLE 语句。 这将减少数据库活动所需的锁定数。 对于分区表,将按所要访问的数据指示的那样首先获取表锁定,然后获取数据分区锁定。
- 专门用于锁定的内存量(由 locklist 数据库配置参数控制)。 如果锁定列表已满,那么性能可能会因为锁定升级以及数据库中共享对象之间的并行性降低而下降。 如果锁定升级频繁发生,那么请增大 locklist 和/或 maxlocks 的值。 要减少同时挂起的锁定数,请确保事务频繁地落实。
每当创建、更改或删除缓冲池时,将设置互斥的缓冲池锁定。 在收集系统监视数据时,您可能会遇到这种类型的锁定。 此锁定的名称是缓冲池本身的标识。
通常,除非存在下列其中一种情况,否则将使用行级别锁定:
- 隔离级别是“未落实的读”
- 隔离级别是“可重复的读”,并且存取方案要求在不使用索引范围谓词的情况下执行扫描
- 表的 LOCKSIZE 属性是 TABLE
- 锁定列表填满,从而引起锁定升级
- 已通过 LOCK TABLE 语句获取显式的表锁定,这将导致并发应用程序进程无法更改或使用表
对于 MDC 表,在下列情况下,将使用块级锁定来代替行级别锁定:
- 表的 LOCKSIZE 属性是 BLOCKINSERT
- 隔离级别是“可重复的读”,并且存取方案涉及谓词
- 搜索型更新或删除操作仅涉及应用于维列的谓词
行锁定的持续时间随使用的隔离级别不同而有所变化:
- UR 扫描:除非行数据正在进行更改,否则不挂起行锁定。
- CS 扫描:通常,仅当游标定位在行上时,才挂起行锁定。 注意,在某些情况下,CS 扫描期间可能完全不挂起锁定。
- RS 扫描:只在事务执行期间挂起合格的行锁定。
- RR 扫描:在事务执行期间挂起所有行锁定。