文章目录

  • 第二十章 Caché 变量大全 $TLEVEL 变量
  • 大纲
  • 描述
    • SQL和$TLEVEL
  • 事务级别和终端提示
  • 示例

 

 
第二十章 Caché 变量大全 $TLEVEL 变量

包含事务处理的当前嵌套级别。

大纲
$TLEVEL
$TL
描述

$TLEVEL包含当前事务级别,即嵌套的打开事务数。发出的TSTART命令的数量决定了事务级别。

  • 每个TSTART将$TLEVEL加1。
  • 每个TCOMMIT将$TLEVEL递减1。
  • 每个TROLBACK 1将$TLEVEL递减1。
  • ROLLBACK将$LEVEL重置为0。

$TLEVEL为0不能递减。当$TLEVEL=0时发出回滚(或回滚1)不执行任何操作。当$TLEVEL=0时发出TCOMMIT会导致<COMMAND>错误。

最大事务级别数为255。尝试超过255个事务级别会生成<Transaction Level>错误。

不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。

SQL和$TLEVEL

$TLEVEL还由SQL TRANSACTION语句设置,如下所示:

  • 初始START TRANSACTION将$TLEVEL设置为1。其他START TRANSACTION语句对$TLEVEL没有影响。
  • 每个SAVEPOINT语句将$TLEVEL递增1。
  • ROLLBACK TO SAVEPOINT POINTNAME语句会递减$TLEVEL。递减量取决于指定的保存点。
  • COMMIT会将$TLEVEL重置为0。
  • 回滚会将$TLEVEL重置为0。

尽管它们共享使用$TLEVEL,但ObjectScript事务处理不同于SQL事务处理,并且与SQL事务处理不兼容。应用程序不应尝试在同一事务中混合使用这两种类型的事务处理语句。

事务级别和终端提示

默认情况下,如果在从终端提示执行的命令行或程序结束时$TLEVEL大于0,则当前事务级别显示为终端提示前缀。

  • 当$TLEVEL = 0时,终端提示将显示名称空间名称(默认情况下)。例如,USER>
  • 当$TLEVEL> 0时,终端提示在名称空间名称之前显示TLn:前缀,n为1到255之间的整数。例如TL4:USER>。

如ZNSPACE中所述,此终端提示显示是可配置的。

SQL Shell提示符不显示当前事务级别。退出SQL Shell后,当前$TLEVEL值将显示在终端提示下。这可以包括在输入SQL Shell之前建立的事务级别以及在SQL Shell中发生的事务级别更改。

MV命令(不带参数)进入交互式MultiValue Shell,并立即回滚所有未完成的事务。退出MultiValue Shell后,当前$TLEVEL值为0。带有MultiValue命令行参数的MV命令不会影响当前事务级别。

示例

下面的示例显示每个TSTART递增$TLEVEL,每个TCOMMIT递减$TLEVEL:

/// d ##class(PHA.TEST.SpecialVariables).TLEVEL()
ClassMethod TLEVEL()
{
	WRITE !,"transaction level ",$TLEVEL  // 0
	TSTART
	WRITE !,"transaction level ",$TLEVEL  // 1
	TSTART
	WRITE !,"transaction level ",$TLEVEL  // 2
	TCOMMIT
	WRITE !,"transaction level ",$TLEVEL  // 1
	TCOMMIT
	WRITE !,"transaction level ",$TLEVEL  // 0
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).TLEVEL()
 
transaction level 0
transaction level 1
transaction level 2
transaction level 1
transaction level 0

以下示例显示,重复调用TSTART会使$TLEVEL递增,而TROLLBACK 1会使$TLEVEL递减。

/// d ##class(PHA.TEST.SpecialVariables).TLEVEL1()
ClassMethod TLEVEL1()
{
	WRITE !,"transaction level ",$TLEVEL  // 0
	TSTART
	WRITE !,"transaction level ",$TLEVEL  // 1
	TSTART
	WRITE !,"transaction level ",$TLEVEL  // 2
	TROLLBACK 1
	WRITE !,"transaction level ",$TLEVEL  // 1
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).TLEVEL1()
 
transaction level 0
transaction level 1
transaction level 2
transaction level 1
TL1:DHC-APP>

下面的示例显示,重复调用TSTART会使$TLEVEL递增,而TROLLBACK会将$TLEVEL重置为0。

/// d ##class(PHA.TEST.SpecialVariables).TLEVEL2()
ClassMethod TLEVEL2()
{
	WRITE !,"transaction level ",$TLEVEL  // 0
	TSTART
	TSTART
	TSTART
	WRITE !,"transaction level ",$TLEVEL  // 3
	TROLLBACK
	WRITE !,"transaction level ",$TLEVEL  // 0
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).TLEVEL2()
 
transaction level 0
transaction level 3
transaction level 0

以下示例显示,如果$TLEVEL为0,则TROLLBACK命令无效:

/// d ##class(PHA.TEST.SpecialVariables).TLEVEL3()
ClassMethod TLEVEL3()
{
	WRITE !,"transaction level ",$TLEVEL  // 0
	TROLLBACK
	WRITE !,"transaction level ",$TLEVEL  // 0
	TROLLBACK 1
	WRITE !,"transaction level ",$TLEVEL  // 0
	TROLLBACK
	WRITE !,"transaction level ",$TLEVEL  // 0
}
DHC-APP> d ##class(PHA.TEST.SpecialVariables).TLEVEL3()
 
transaction level 0
transaction level 0
transaction level 0
transaction level 0