文章
姚 鑫 · 十一月 19, 2021 阅读大约需 2 分钟

第八十一章 SQL命令 UNLOCK

第八十一章 SQL命令 UNLOCK

解锁表

大纲

UNLOCK [TABLE] tablename IN EXCLUSIVE MODE [IMMEDIATE]

UNLOCK [TABLE] tablename IN SHARE MODE [IMMEDIATE]

参数

  • tablename - 要解锁的表的名称。
    Tablename必须是已经存在的表。
    表名可以是限定的(schema.table),也可以是非限定的(table)。
    非限定表名接受默认模式名。
    模式搜索路径被忽略。
  • IN EXCLUSIVE MODE / IN SHARE MODE - IN EXCLUSIVE MODE关键字短语释放常规的IRIS锁。
    IN SHARE MODE关键字短语在IRIS级别释放共享锁。

描述

UNLOCK命令用来解锁被LOCK命令锁定的SQL表。
此表必须是已存在的表,您对其具有必要的特权。
如果tablename是临时表,则命令执行成功,但不执行任何操作。
如果tablename是视图,则命令失败,并出现SQLCODE -400错误。

UNLOCKUNLOCK TABLE是同义词。

UNLOCK命令用来反转LOCK操作。
即使没有锁被持有,UNLOCK命令也会成功完成。
可以使用LOCK多次锁定一个表;
必须显式解锁表,解锁次数为表被显式锁定的次数。

权限

该命令为特权操作。
在使用UNLOCK IN SHARE MODE之前,进程必须对指定的表拥有SELECT权限。
在使用UNLOCK IN EXCLUSIVE MODE之前,进程必须对指定的表具有INSERTUPDATEDELETE权限。
对于IN EXCLUSIVE MODE, INSERTUPDATE特权必须在表的至少一个字段上。
未能持有足够的特权将导致SQLCODE -99错误(特权违反)。
可以通过调用%CHECKPRIV命令来确定当前用户是否具有必要的特权。
通过调用$SYSTEM.SQL.Security.CheckPrivilege()方法,可以确定指定的用户是否具有必要的表级特权。

Nonexistent Table

如果试图解锁一个不存在的表,则unlock会失败,并出现编译错误,并且会出现SQLCODE=-30: table 'SQLUser. txt . txt消息。
mytable”未找到。

示例

下面的嵌入式SQL示例创建一个表,锁定它,然后解锁它:

ClassMethod Unlock()
{
    n SQLCODE,%msg
    &sql(
        CREATE TABLE mytest (
            ID NUMBER(12,0) NOT NULL,
            CREATE_DATE DATE DEFAULT CURRENT_TIMESTAMP(2),
            WORK_START DATE DEFAULT SYSDATE
        ) 
    )
    if SQLCODE = 0 { 
        w !,"创建表" 
    } else { 
        w !,"CREATE TABLE error: ",SQLCODE
        q 
    }
}
ClassMethod Unlock1()
{
    n SQLCODE,%msg
    &sql(
        LOCK mytest IN EXCLUSIVE MODE
    ) 
    if SQLCODE =0  { 
        w !,"锁表" 
    } elseif SQLCODE = -110 { 
        w !,"表被另一个进程锁定",!,%msg 
    } else { 
        w !,"其他 LOCK error: ",SQLCODE,!,%msg 
    }
    &sql(
        UNLOCK mytest IN EXCLUSIVE MODE
    ) 
    if SQLCODE=0 { 
        w !,"解锁表" 
    } else { 
        w !,"其他 UNLOCK error: ",SQLCODE,!,%msg 
    }
}

DHC-APP>d ##class(PHA.TEST.SQLCommand).Unlock1()

锁表
解锁表
0
0 25
讨论 (0)1
登录或注册以继续