第十三章 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 还提供了一个锁队列,进程会等待,直到有空间将其锁添加到锁表中。
但是,如果两个进程各自对已被另一个进程锁定的变量断言增量锁,则这种情况称为死锁,并且被视为应用程序编程错误。












网友评论