第十三章 ObjectScript - 特殊变量
特殊变量
一些特殊变量提供有关代码运行环境的信息。其中包括以下内容:
- $HOROLOG
,包含操作系统给出的当前进程的日期和时间。请参阅日期和时间值。
- $USERNAME
和 $ROLES
,包含有关当前使用的用户名以及该用户所属角色的信息。
write "You are logged in as: ", $USERNAME, !, "And you belong to these roles: ",$ROLES
$ZVERSION
,其中包含标识当前运行的IRIS
版本的字符串。
其他包括 $JOB
、$ZTIMEZONE
、$IO
和 $ZDEVICE
。
其他变量提供有关代码处理状态的信息。其中包括 $STACK
、$TLEVEL
、$NAMESPACE
和 $ZERROR
。
$SYSTEM
特殊变量
特殊变量 $SYSTEM
提供对大量实用方法的轻松访问。
特殊变量 $SYSTEM
是 %SYSTEM
包的别名,其中包含提供可满足各种需求的类方法的类。引用 %SYSTEM
中方法的惯用方法是构建使用 $SYSTEM
变量的引用。例如,以下命令在类中执行 %SYSTEM.OBJ
中的 SetFlags()
方法:
DO $SYSTEM.OBJ.SetFlags("ck")
由于特殊变量的名称不区分大小写(与类及其成员的名称不同),因此以下命令都是等效的:
DO ##class(%SYSTEM.OBJ).SetFlags("ck")
DO $System.OBJ.SetFlags("ck")
DO $SYSTEM.OBJ.SetFlags("ck")
DO $system.OBJ.SetFlags("ck")
这些类都提供了 Help()
方法,该方法可以打印类中可用方法的列表。例如:
TESTNAMESPACE>d $system.OBJ.Help()
'Do $system.OBJ.Help(method)' will display a full description of an individual method.
Methods of the class: %SYSTEM.OBJ
CloseObjects()
Deprecated function, to close objects let them go out of scope.
Compile(classes,qspec,&errorlog,recurse)
Compile a class.
CompileAll(qspec,&errorlog)
Compile all classes within this namespace
....
还可以使用方法名称作为 Help()
的参数。例如:
TESTNAMESPACE>d $system.OBJ.Help("Compile")
Description of the method:class Compile:%SYSTEM.OBJ
Compile(classes:%String="",qspec:%String="",&errorlog:%String,recurse:%Boolean=0)
Compile a class.
<p>Compiles the class <var>classes</var>, which can be a single class, a comma separated list,
a subscripted array of class names, or include wild cards. If <var>recurse</var> is true then
do not output the intial 'compiling' message or the compile report as this is being called inside
another compile loop.<br>
<var>qspec</var> is a list of flags or qualifiers which can be displayed with
'Do $system.OBJ.ShowQualifiers()'
and 'Do $system.OBJ.ShowFlags()
锁定和并发控制
任何多进程系统的一个重要特征是并发控制,能够防止不同进程同时更改数据的特定元素,从而导致损坏。因此,ObjectScript
提供了一个锁管理系统。
基础
基本的锁定机制是 LOCK
命令。该命令的目的是延迟一个进程中的活动,直到另一进程发出可以继续进行的信号为止。
重要的是要理解锁本身并不会阻止其他进程修改关联的数据;它会阻止其他进程修改相关数据。也就是说, IRIS
不强制执行单方面锁定。锁定仅按照约定工作:它要求相互竞争的进程都使用相同的锁名称实现锁定。
下面描述一个常见的锁场景:进程A
发出LOCK
命令, IRIS尝试创建锁。如果进程 B
已经拥有具有给定锁名称的锁,则进程 A
将暂停。具体来说,进程A
中的LOCK
命令没有返回,并且不能执行连续的代码行。当进程B
释放锁时,进程A
中的LOCK
命令最终返回并继续执行。
在许多情况下,系统会在内部自动使用 LOCK
命令,例如当使用持久对象或使用某些 SQL
命令时。
锁表
IRIS
维护一个系统范围的内存表,记录所有当前锁以及拥有这些锁的进程。该表(锁表)可通过管理门户访问,可以在其中查看锁并(在极少数情况下,如果需要)删除它们。
锁表不能超过可以指定的固定大小。有因此,锁表可能会被填满,从而无法进行进一步的锁定。填充锁通常不被认为是应用程序错误; IRIS
还提供了一个锁队列,进程会等待,直到有空间将其锁添加到锁表中。
但是,如果两个进程各自对已被另一个进程锁定的变量断言增量锁,则这种情况称为死锁,并且被视为应用程序编程错误。