您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

LOCK TABLE 语句

禁止其它并发事务在指定时间内访问或修改表或由较早事务释放的锁。

快速链接:

转至参数

转至示例

转至用法

转至标准

转至权限

语法

LOCK TABLE table-list [ WITH HOLD ] 

IN { SHARE | WRITE | EXCLUSIVE } MODE [  WAIT

table-list

 ] [ , [  ] , ...]

参数

  • table-name 必须是基表,而不是视图。WRITE 模式仅对 IQ 基表有效。LOCK TABLE 要么锁定表列表中的所有表,要么不锁定任何表。必须为该表启用行级版本控制 (RLV)。当为 SAP SQL Anywhere 表获取锁,或者当获取 SHARE 或 EXCLUSIVE 锁时,只能指定一个表。使用标准 SAP IQ 对象限定规则分析 <table-name>。

  • WITH HOLD 该锁会一直保持到连接结束时为止。如果未指定此子句,则提交或回退当前事务时将释放锁定。不支持在同一语句中使用 WITH HOLD 和 WRITE MODE 子句,这将返回错误 SQLCODE=-131, ODBC 3 State="42000"。

  • SHARE 防止其它事务修改表,但允许它们读取访问。在此模式中,只要没有其它的事务锁定要修改的行,就可以间接地或显式地使用 LOCK TABLE 更改表中的数据。

  • WRITE 防止其它事务修改表的列表。无条件提交连接最外层的事务。事务的快照版本不是由 LOCK TABLE IN WRITE MODE 语句建立的,而是通过执行 SAP IQ 处理的下一命令建立的。 当事务提交或回退或者断开连接时,会解除 WRITE 模式锁。

  • EXCLUSIVE 防止其它事务访问表。在此模式中,任何其它事务都不能对表执行任何种类的查询、更新或任何其它操作。

  • WAIT time 指定所有锁类型的最大阻塞时间。当锁定模式为 WRITE 时,此子句为必填。给定时间参数后,仅当服务器在指定时间内可用时,其才会锁定指定表。可以使用 hh:nn:ss:sss 格式指定时间参数。如果指定了日期部分,服务器将忽略此部分,并将参数转换为时间戳。如果未给定时间参数,服务器将无限期等待,直到 WRITE 锁可用或发生中断为止。

    示例

  • 示例 1 在 Customers 和 Employees 表中获取 WRITE 锁(如果在 5 分 3 秒内可用): LOCK TABLE Customers, Employees IN WRITE MODE WAIT'00:05:03'

  • 示例 2 无限期等待,直到在 Customers 和 Employees 表上的 WRITE 锁可用或发生中断为止: LOCK TABLE Customers, Employees IN WRITE MODE WAIT

    用法

    Multiplex 上,只有协调器支持 LOCK TABLE

    在协调器的 IQ 主存储库中的表上运行 LOCK TABLE 语句,不会影响从次级服务器上的连接访问这些表。例如:

    在协调器连接上,发出命令:

    LOCK TABLE coord1 WITH HOLD IN EXCLUSIVE MODE

    协调器上的 sp_iqlocks 会确认表 coord1 具有排它 (E) 锁。

    在辅助服务器的连接上运行的 sp_iqlocks 的结果不会显示表 coord1 上的排它锁。此连接上的用户可查看协调器上表 coord1 的更新。

    协调器上的其它连接可查看 coord1 表上的排它锁,如果尝试通过协调器上的其它连接从 coord1 表中进行选择,则将返回 User DBA has the row in coord1 locked(用户 DBA 具有在 coord1 中锁定的行)。

    不支持在视图上执行 LOCK TABLE。尝试锁定视图将获取共享模式锁,而不管命令中指定的模式如何。共享模式锁会阻止其它事务修改表模式。

    Transact-SQL (T-SQL) 存储过程方言不支持 LOCK TABLE。例如,此语句返回 LOCK 附近的语法错误:

    CREATE PROCEDURE tproc()
    

    AS

    BEGIN

    COMMIT;

    LOCK TABLE t1 IN SHARE MODE

    INSERT INTO t1 VALUES(30)

    END

    Watcom-SQL 存储过程方言支持 LOCK TABLE。缺省命令分隔符为分号 (;)。例如:

    CREATE PROCEDURE tproc()
    

    AS

    BEGIN

    COMMIT;

    LOCK TABLE t1 IN SHARE MODE

    INSERT INTO t1 VALUES(30)

    END

    标准

  • SQL - ISO/ANSI SQL 语法的服务商扩充。

  • SAP 数据库产品 — 受 SAP ASE 支持。SAP ASE 不支持 WITH HOLD 子句。SAP ASE 提供 SAP SQL Anywhere 不支持的 WAIT 子句。

    权限

    要在 SHARE 模式中锁定表,您必须是该表的所有者或者具有以下其中一种特权:

  • 表的 SELECT 对象级特权

  • SELECT ANY TABLE 系统特权

    要在 EXCLUSIVE 模式中锁定表,您必须是该表的所有者或者具有以下其中一种特权:

  • ALTER ANY OBJECT 系统特权

  • ALTER ANY TABLE 系统特权

  • 表的 ALTER 对象级特权