LOCK TABLE 语句
LOCK TABLE 语句用于锁定当前服务器上的表、表空间或表空间分区。 如果流程中已经有一个合适的锁,则不会获取新的锁。
调用 LOCK TABLE
此语句可嵌入应用程序中或者以交互方式发出。 它是可动态准备的可执行语句。
授权 LOCK TABLE
以下定义的特权套装必须至少包含以下一项:
- 确定表的 SELECT 权限 (SELECT 权限不适用于辅助表)
- 对表的所有权
- DBADM 数据库权限
- SYSADM 或 SYSCTRL 权限
- DATAACCESS 权限
如果数据库是隐式创建的,则数据库权限必须位于隐式数据库或 DSNDB04 上。
权限设置:
如果语句嵌入到应用程序中,权限集就是计划或软件包所有者所拥有的权限。 如果语句是动态编写的,则权限集由生效的 DYNAMICRULES 行为(运行、绑定、定义或调用)决定, 如表 1 所示。 (有关这些行为的详细信息,包括决定这些行为的 DYNAMICRULES 绑定选项值列表,请参阅授权 ID 和动态 SQL )
语法 LOCK TABLE
描述 LOCK TABLE
- table-name
- 标识要锁定的表格。 名称必须标识当前服务器上存在的表。
它不得标识视图、临时表(已创建或已声明)、仅加速器表、目录表或目录表。
锁可能只适用于该表,也可能不适用。 锁定辅助表的作用是锁定包含辅助表的LOB表空间。 - 分区整数
标识要锁定的分区表空间的分区。 以表名标识的表必须属于分区表空间。 为整数指定的值必须是一个不超过表空间分区数的整数。
如果省略分区表空间中表的分区子句,则所有分区都会被锁定。
- 在共享模式下
- 对于非辅助表的表锁,要求获取一个锁,该锁可防止其他进程对表执行除只读操作外的任何操作。 在共享模式下,锁定LOB表空间时,会请求锁定,以防止存储空间被重新分配。 当锁定 LOB 表空间时,其他进程可以删除 LOB 或将其更新为空值,但不能插入非空值的 LOB。 执行语句后,进程持有的锁类型取决于进程是否已经持有锁,以及持有的锁类型。
- 独家模式
- 申请流程需要使用专属锁。 在解锁之前,它阻止并发进程在表中执行任何操作。例外情况
除非锁定的是 LOB 表空间、分区(非 UTS)表空间或通用表空间 (UTS),否则以未提交读取 (UR) 隔离级别运行的并发进程可以对表执行只读操作。 使用 CURRENTDATA(NO),以游标稳定性(CS)隔离级别运行的并发进程,在使用锁避免功能读取已提交的数据时,可以对表执行只读操作。
请注意,对桌子、桌子空间或隔板的独占锁定并不能阻止其他交易对锁定对象提出主张。
备注 LOCK TABLE
- LOCK TABLE语句获得的锁
发出LOCK TABLE语句时获得的锁取决于所请求的模式和表空间类型。
对于大多数表空间类型,LOCK TABLE语句用于获取表空间或特定分区的锁。 对于分段(非UTS)表空间,LOCK TABLE语句适用于单个表。
下表显示了LOCK TABLE语句在分段和非分段表空间中获得的锁模式。
表 1. 锁具类型由LOCK TABLE 提供。 分区上的锁定表与非分割表空间的行为相同。 锁定表格 在 UTS或非分段表空间 分段表空间 表格在分段表格空间中 独家模式 X X IX 共享方式 S或SIX1 S或SIX1 IS 注:- 如果流程中已经有一个IX锁,则获得SIX锁。 如果流程已经锁定模式SIX、U或X,则SHARE MODE不起作用。
- 释放为 LOCK TABLE 语句获取的锁
对于 LOCK TABLE 语句,工作单元结束时生效的 RELEASE 绑定选项可控制 Db2 释放锁的时间。 如果应用程序在不同的 RELEASE 选项下发布后续语句,则 LOCK TABLE 语句执行时有效的 RELEASE 选项可能会发生变化。 更多信息,请参阅 RELEASE 绑定选项。
在 RELEASE(DEALLOCATE) 选项有效的情况下,当应用程序结束时计划被解除分配, Db2 就会释放锁)
如果使用 RELEASE(COMMIT) 选项, Db2 会在下一个工作单元(COMMIT 或 ROLLBACK)结束时释放锁,除非该表或表空间被持有的游标引用。 持有的游标允许 Db2 在工作单元结束后仍将准备好的语句保留在内存中。 在这种情况下, Db2 会保留锁,直到准备好的语句从内存中释放出来。
如果在通用表空间(UTS)的一个工作单元结束后仍持有锁,则新用户登录会导致 Db2 释放从先前线程发出的 LOCK TABLE 语句继承的锁。
如果在非 UTS 表空间中的表的工作单元结束后仍持有锁,则会在工作单元结束时降级为意图锁。
- 语法替代和同义词
- 为了与 Db2 的早期版本兼容,PART可以被指定为PARTITION的同义词。
示例 LOCK TABLE
LOCK TABLE DSN8C10.EMP IN EXCLUSIVE MODE;