第四十八章 Caché 变量大全 ^$LOCK 变量

2021-02-27  本文已影响0人  Cache技术分享

第四十八章 Caché 变量大全 ^$LOCK 变量

提供锁名信息。

大纲

^$|nspace|LOCK(lock_name,info_type,pid) 
^$|nspace|L(lock_name,info_type,pid)

参数

描述

^$LOCK结构化系统变量返回有关当前命名空间或本地系统上指定命名空间中的锁的信息。可以通过两种方式使用^$LOCK:

注意:^$LOCK从本地系统的锁表中检索锁表信息。它不会从远程服务器上的锁表中返回信息。

ECP环境中的^$LOCK。

参数

nspace

此可选参数允许您使用扩展的SSVN引用在另一个名称空间中指定全局变量。可以显式指定名称空间名称,将其命名为带引号的字符串文字或变量,或者通过指定隐式名称空间。命名空间名称不区分大小写。可以使用方括号语法[“ USER”]或环境语法|“ USER” |。 nspace分隔符前后不允许有空格。

可以使用以下方法测试是否定义了名称空间:

   WRITE ##class(%SYS.Namespace).Exists("USER"),! 
   WRITE ##class(%SYS.Namespace).Exists("LOSER")   

可以使用$NAMESPACE特殊变量来确定当前的名称空间。更改当前名称空间的首选方法是NEW $NAMESPACE,然后SET $NAMESPACE =“nspacename”

lock_name

该表达式的计算结果为包含锁定变量名称(带下标或未下标)的字符串。使用LOCK命令定义一个锁变量(通常是全局变量)。

info_type

当将^$LOCK用作独立函数时,需要一个info_type关键字;当将^$LOCK用作另一个函数的参数时,则是一个可选参数。 info_type必须以大写字母指定为带引号的字符串。

必须使用所有大写字母指定info_type关键字。指定无效的info_type关键字会生成<SUBSCRIPT>错误。

pid

锁所有者的进程ID。仅在使用“COUNTS”关键字时有意义。用于将“ ”返回值限制为(最多)一个列表元素。 pid在所有平台上均指定为整数。如果pid与lock_name ^$LOCK的所有者的进程ID匹配,则返回该所有者的“COUNTS”列表元素;如果pid与lock_name ^$LOCK的所有者的进程ID不匹配,则返回空字符串。将pid指定为0表示与省略pid相同; ^$LOCK返回所有“COUNTS”列表元素。pid参数与“OWNER”“FLAGS”“MODE”关键字一起使用,但被忽略。

示例

下面的示例显示由info_type关键字返回的排他锁的值:

/// d ##class(PHA.TEST.SpecialVariables).LOCK()
ClassMethod LOCK()
{
    LOCK ^B(1,1)  ; define lock
    WRITE !,"lock owner: ",^$LOCK("^B(1,1)","OWNER")
    WRITE !,"lock flags: ",^$LOCK("^B(1,1)","FLAGS")
    WRITE !,"lock mode: ",^$LOCK("^B(1,1)","MODE")
    WRITE !,"lock counts: "
    ZZDUMP ^$LOCK("^B(1,1)","COUNTS")
    LOCK -^B(1,1) ; delete lock
}

DHC-APP>d ##class(PHA.TEST.SpecialVariables).LOCK()
 
lock owner: 17824
lock flags:
lock mode: X
lock counts:
0000: 0B 01 04 04 A0 45 03 04 01 02 01                        ....??E.....

下面的示例显示在递增和递减独占锁时,info_type “COUNTS”返回的值如何变化:

/// d ##class(PHA.TEST.SpecialVariables).LOCK1()
ClassMethod LOCK1()
{
    LOCK ^B(1,1)      ; define exclusive lock
    ZZDUMP ^$LOCK("^B(1,1)","COUNTS")
    LOCK +^B(1,1) ; increment lock
    ZZDUMP ^$LOCK("^B(1,1)","COUNTS")
    LOCK +^B(1,1) ; increment lock again
    ZZDUMP ^$LOCK("^B(1,1)","COUNTS")
    LOCK -^B(1,1) ; decrement lock
    ZZDUMP ^$LOCK("^B(1,1)","COUNTS")
    LOCK -^B(1,1) ; decrement lock again
    ZZDUMP ^$LOCK("^B(1,1)","COUNTS")
    LOCK -^B(1,1) ; delete exclusive lock
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).LOCK1()
 
0000: 0B 01 04 04 A0 45 03 04 01 02 01                        ....??E.....
0000: 0B 01 04 04 A0 45 03 04 02 02 01                        ....??E.....
0000: 0B 01 04 04 A0 45 03 04 03 02 01                        ....??E.....
0000: 0B 01 04 04 A0 45 03 04 02 02 01                        ....??E.....
0000: 0B 01 04 04 A0 45 03 04 01 02 01                        ....??E.....

下面的示例显示在递增和递减共享锁时,info_type“COUNTS”返回的值如何变化

/// d ##class(PHA.TEST.SpecialVariables).LOCK2()
ClassMethod LOCK2()
{
    LOCK ^S(1,1)#"S"   ; define shared lock
    ZZDUMP ^$LOCK("^S(1,1)","COUNTS")
    LOCK +^S(1,1)#"S" ; increment lock
    ZZDUMP ^$LOCK("^S(1,1)","COUNTS")
    LOCK +^S(1,1)#"S" ; increment lock again
    ZZDUMP ^$LOCK("^S(1,1)","COUNTS")
    LOCK -^S(1,1)#"S" ; decrement lock
    ZZDUMP ^$LOCK("^S(1,1)","COUNTS")
    LOCK -^S(1,1)#"S" ; decrement lock again
    ZZDUMP ^$LOCK("^S(1,1)","COUNTS")
    LOCK -^S(1,1)#"S" ; delete shared lock
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).LOCK2()
 
0000: 0B 01 04 04 A0 45 02 01 03 04 01                        ....??E.....
0000: 0B 01 04 04 A0 45 02 01 03 04 02                        ....??E.....
0000: 0B 01 04 04 A0 45 02 01 03 04 03                        ....??E.....
0000: 0B 01 04 04 A0 45 02 01 03 04 02                        ....??E.....
0000: 0B 01 04 04 A0 45 02 01 03 04 01                        ....??E.....

以下示例显示如何将^$lock用作$DATA$ORDER$QUERY函数的参数。

作为$DATA的参数

$DATA(^$|nspace|LOCK(lock_name))

^$lock作为$DATA的参数返回一个整数值,该值指定锁定名称是否作为节点存在于^$lock中。下表显示了$DATA可以返回的整数值。

Value Meaning
0 锁信息不存在
10 锁信息存在

请注意,在此上下文中使用的$DATA只能返回0或10,其中10表示指定的锁存在。它不能确定锁是否有后代,也不能返回1或11。

下面的示例测试当前命名空间中是否存在锁名。第一次写入返回10(锁名存在),第二次写入返回0(锁名不存在):

/// d ##class(PHA.TEST.SpecialVariables).LOCK3()
ClassMethod LOCK3()
{
    LOCK ^B(1,2)  ; define lock
    WRITE !,$DATA(^$LOCK("^B(1,2)"))
    LOCK -^B(1,2) ; delete lock
    WRITE !,$DATA(^$LOCK("^B(1,2)"))
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).LOCK3()
 
10
0

作为$ORDER的参数

$ORDER(^$|nspace|LOCK(lock_name),direction)

^$lock作为$ORDER的参数,按排序顺序将下一个或上一个^$lock锁名节点返回到指定的锁名。如果不存在这样的锁名作为^$lock节点,$ORDER将返回空字符串。

锁以区分大小写的字符串排序顺序返回。使用数字排序规则以下标树顺序返回命名锁的下标。

Direction参数指定是返回下一个锁名称还是返回上一个锁名称。如果不提供方向参数,InterSystems IRIS会将排序序列中的下一个锁名返回到您指定的锁名。

以下子例程在Samples名称空间中搜索锁,并将锁名称存储在名为locket的本地数组中。

/// d ##class(PHA.TEST.SpecialVariables).LOCK4()
ClassMethod LOCK4()
{
LOCKARRAY
    SET lname=""
    FOR I=1:1 {
    SET lname=$ORDER(^$|"SAMPLES"|LOCK(lname))
        QUIT:lname=""
        SET LOCKET(I)=lname
        WRITE !,"the lock name is: ",lname
    }
    WRITE !,"All lock names listed"
    QUIT
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).LOCK4()
 
the lock name is: ^%SYS("CSP","Daemon")
All lock names listed

作为$QUERY的参数

$QUERY(^$|nspace|LOCK(lock_name))

^$lock作为$query的参数,将排序序列中的下一个锁名返回到您指定的锁名。如果没有将下一个锁名定义为^$lock中的节点,则$query将返回空字符串。

锁以区分大小写的字符串排序顺序返回。使用数字排序规则以下标树顺序返回命名锁的下标。

在下面的示例中,在当前命名空间中(按随机顺序)创建了五个全局锁名称。

/// d ##class(PHA.TEST.SpecialVariables).LOCK5()
ClassMethod LOCK5()
{
    LOCK (^B(1),^A,^D,^A(1,2,3),^A(1,2))
    WRITE !,"lock name: ",$QUERY(^$LOCK(""))
    WRITE !,"lock name: ",$QUERY(^$LOCK("^C"))
    WRITE !,"lock name: ",$QUERY(^$LOCK("^A(1,2)"))
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).LOCK5()
 
lock name: ^$LOCK("^%SYS(""CSP"",""Daemon"")")
lock name: ^$LOCK("^D")
lock name: ^$LOCK("^A(1,2,3)")

$QUERY将所有全局锁变量名(带下标或无下标)视为字符串,并按字符串排序顺序检索它们。因此,$QUERY(^$LOCK(“”))按排序顺序检索第一个锁名:^$LOCK(“^A”)或排序序列中位置较高的InterSystems IRIS定义的锁。$QUERY(^$LOCK(“^C”))检索排序序列中不存在的^C^$LOCK(“^D”)之后的下一个锁名。$QUERY(^$LOCK(“^A(1,2)”))检索排序规则序列中它后面的^$LOCK(“^A(1,2,3)”)

上一篇下一篇

猜你喜欢

热点阅读