文章
· 八月 29, 2023 阅读大约需 4 分钟

第十三章 ObjectScript - 特殊变量

第十三章 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 还提供了一个锁队列,进程会等待,直到有空间将其锁添加到锁表中。

但是,如果两个进程各自对已被另一个进程锁定的变量断言增量锁,则这种情况称为死锁,并且被视为应用程序编程错误。

讨论 (0)1
登录或注册以继续