文章目录

  • 第二十八章 Caché 命令大全 TSTART 命令
  • 重点
  • 大纲
    • 参数
  • 描述
    • 嵌套事务
  • SQL Transactions
  • 参数
    • pc
  • 示例

第二十八章 Caché 命令大全 TSTART 命令

重点

  1. 为嵌套事务发出TROLLBACK 1将回滚在该嵌套事务中所做的更改,并递减$TLEVEL。无论发出了多少级别的TSTART,都可以发出TROLLBACK来回滚整个事务。
  2. 发出TSTART会递增$TLEVEL
  3. 嵌套事务期间所做的更改仅在提交最外面的事务时才不可逆转地提交;也就是说,当TCOMMIT$TLEVEL值递减为0时。
  4. 嵌套事务的最大层数为255。

大纲

TSTART:pc
TS:pc

参数

  • pc 可选 - 后置表达式

描述

TSTART标记事务的开始。在TSTART之后,记录数据库操作以启用后续的TCOMMITTROLLBACK命令。

TSTART递增$TLEVEL特殊变量的值。$TLEVEL值为0表示没有有效的事务。第一个TSTART开始一个事务,并将$TLEVEL递增到1。后续TSTART命令可以创建嵌套事务,从而进一步递增$TLEVEL

并非事务内发生的所有操作都可以回滚。例如,在事务内设置全局变量可以回滚;在事务内设置局部变量不能回滚。

默认情况下,事务内发布的锁将一直保持到事务结束,即使该锁在事务内释放也是如此。设置锁定时可以覆盖此默认值。

嵌套事务

如果在事务内发出TSTART,它将开始嵌套事务。发出TSTART会递增$TLEVEL值,指示事务嵌套的层数。可以通过发出TCOMMIT提交嵌套事务或发出TRolback1回滚嵌套事务来结束嵌套事务。结束嵌套事务会使$TLEVEL值递减1。

  • 为嵌套事务发出TROLLBACK 1将回滚在该嵌套事务中所做的更改,并递减$TLEVEL。无论发出了多少级别的TSTART,都可以发出TROLLBACK来回滚整个事务。
  • 为嵌套事务发出TCOMMIT会使$TLEVEL递减,但嵌套事务的实际提交会延迟。嵌套事务期间所做的更改仅在提交最外面的事务时才不可逆转地提交;也就是说,当TCOMMIT$TLEVEL值递减为0时。

可以使用%SYS.Journal.System类的GetImageJournalInfo()方法在日志文件中搜索TSTART命令,从而识别打开的事务。如果$TLEVEL为零,则TSTART写入“BT”(BEGIN TRANSACTION)日志文件记录,如果$TLEVEL大于0,则写入“BTL”(BEGIN TRANSACTION WITH LEVEL)日志文件记录。

嵌套事务的最大层数为255。尝试超过此嵌套级别限制会导致<Transaction Level>错误。

SQL Transactions

CachéObjectScript和SQL TRANSACTION命令完全兼容且可互换,但有以下例外:如果没有当前事务,ObjectScript TSTARTSQL START TRANSACTION都会启动事务。但是,START TRANSACTION不支持嵌套事务。因此,如果需要(或可能需要)嵌套事务,最好使用TSTART启动事务。如果需要与SQL标准兼容,请使用START TRANSACTION

CachéObjectScript事务处理为嵌套事务提供有限的支持。SQL事务处理为事务内的保存点提供支持。

参数

pc

可选的后置条件表达式。如果后置条件表达式为TRUE,则Caché执行TSTART命令;如果后置条件表达式为FALSE,则Caché不执行TSTART命令。

示例

下面的示例使用单级事务将随机金额的资金从一个帐户转移到另一个帐户。如果转帐金额大于可用余额,程序将回退事务处理:

/// d ##class(PHA.TEST.Command).TestBankAccounts()
ClassMethod TestBankAccounts()
{SetupBankAccountsSET num=12345SET ^CHECKING(num,"balance")=500.99SET ^SAVINGS(num,"balance")=100.22IF $DATA(^NumberOfTransfers)=0 {SET ^NumberOfTransfers=0}
BankTransferWRITE "转移之前:",!,"Checking=$",^CHECKING(num,"balance")," Savings=$",^SAVINGS(num,"balance"),!// 将资金从一个账户转到另一个账户SET transfer=$RANDOM(1000)WRITE "转账金额 $",transfer,!DO CkToSav(num,transfer)IF ok=1 {WRITE "成功转移",!,"迄今为止的转账次数=",^NumberOfTransfers,!} ELSE {WRITE "*** 资金不足 ***",!}WRITE "转移之后:",!,"Checking=$",^CHECKING(num,"balance")," Savings=$",^SAVINGS(num,"balance"),!RETURN
CkToSav(acct,amt)TSTARTSET ^CHECKING(acct,"balance") = ^CHECKING(acct,"balance") - amtSET ^SAVINGS(acct,"balance") = ^SAVINGS(acct,"balance") + amtSET ^NumberOfTransfers=^NumberOfTransfers + 1IF ^CHECKING(acct,"balance") > 0 {TCOMMIT  SET ok=1 QUIT:ok}ELSE {TROLLBACK  SET ok=0 QUIT:ok}
}
DHC-APP>d ##class(PHA.TEST.Command).TestBankAccounts()
转移之前:
Checking=$500.99 Savings=$100.22
转账金额 $669
*** 资金不足 ***
转移之后:
Checking=$500.99 Savings=$100.22DHC-APP>d ##class(PHA.TEST.Command).TestBankAccounts()
转移之前:
Checking=$500.99 Savings=$100.22
转账金额 $84
成功转移
迄今为止的转账次数=5
转移之后:
Checking=$416.99 Savings=$184.22

以下示例使用TSTART创建嵌套事务。它们显示了三种回滚嵌套事务的方案:

回滚最里面的事务,提交中间事务,提交最外面的事务:

/// d ##class(PHA.TEST.Command).TestTstart()
ClassMethod TestTstart()
{KILL ^a,^b,^cTSTART  SET ^a=1 WRITE "tlevel=",$TLEVEL,!TSTART  SET ^b=2 WRITE "tlevel=",$TLEVEL,!TSTART  SET ^c=3 WRITE "tlevel=",$TLEVEL,!TROLLBACK 1 WRITE "tlevel=",$TLEVEL,!TCOMMIT  WRITE "tlevel=",$TLEVEL,!TCOMMIT  WRITE "tlevel=",$TLEVEL,!IF $DATA(^a) {WRITE "^a=",^a,!} ELSE {WRITE "^a is undefined",!}IF $DATA(^b) {WRITE "^b=",^b,!} ELSE {WRITE "^b is undefined",!}IF $DATA(^c) {WRITE "^c=",^c,!} ELSE {WRITE "^c is undefined",!}
}
DHC-APP>d ##class(PHA.TEST.Command).TestTstart()
tlevel=1
tlevel=2
tlevel=3
tlevel=2
tlevel=1
tlevel=0
^a=1
^b=2
^c is undefined

提交最里面的事务,回滚中间的事务,提交最外面的事务:

/// d ##class(PHA.TEST.Command).TestTstart1()
ClassMethod TestTstart1()
{KILL ^a,^b,^cTSTART  SET ^a=1 WRITE "tlevel=",$TLEVEL,!TSTART  SET ^b=2 WRITE "tlevel=",$TLEVEL,!TSTART  SET ^c=3 WRITE "tlevel=",$TLEVEL,!TCOMMIT  WRITE "tlevel=",$TLEVEL,!TROLLBACK 1 WRITE "tlevel=",$TLEVEL,!TCOMMIT  WRITE "tlevel=",$TLEVEL,!IF $DATA(^a) {WRITE "^a=",^a,!} ELSE {WRITE "^a is undefined",!}IF $DATA(^b) {WRITE "^b=",^b,!} ELSE {WRITE "^b is undefined",!}IF $DATA(^c) {WRITE "^c=",^c,!} ELSE {WRITE "^c is undefined",!}
}
DHC-APP>d ##class(PHA.TEST.Command).TestTstart1()
tlevel=1
tlevel=2
tlevel=3
tlevel=2
tlevel=1
tlevel=0
^a=1
^b is undefined
^c is undefined

提交最里面的事务,提交中间的事务,回滚最外面的事务:

/// d ##class(PHA.TEST.Command).TestTstart2()
ClassMethod TestTstart2()
{KILL ^a,^b,^cTSTART  SET ^a=1  WRITE "tlevel=",$TLEVEL,!TSTART  SET ^b=2  WRITE "tlevel=",$TLEVEL,!TSTART  SET ^c=3  WRITE "tlevel=",$TLEVEL,!TCOMMIT  WRITE "tlevel=",$TLEVEL,!TCOMMIT  WRITE "tlevel=",$TLEVEL,!TROLLBACK 1  WRITE "tlevel=",$TLEVEL,!IF $DATA(^a) {WRITE "^a=",^a,!} ELSE {WRITE "^a is undefined",!}IF $DATA(^b) {WRITE "^b=",^b,!} ELSE {WRITE "^b is undefined",!}IF $DATA(^c) {WRITE "^c=",^c,!} ELSE {WRITE "^c is undefined",!}
}
DHC-APP>d ##class(PHA.TEST.Command).TestTstart2()
tlevel=1
tlevel=2
tlevel=3
tlevel=2
tlevel=1
tlevel=0
^a is undefined
^b is undefined
^c is undefined

请注意,在第三种情况下,TROLLBACK 1TROLLBACK将具有相同的结果,因为两者都会将$ TLEVEL减为0。

第二十八章 Caché 命令大全 TSTART 命令相关推荐

  1. 第六十八章 Caché 函数大全 $WASCII 函数

    文章目录 第六十八章 Caché 函数大全 $WASCII 函数 大纲 参数 描述 示例 第六十八章 Caché 函数大全 $WASCII 函数 返回识别代理项对的字符对应的数字代码. 大纲 $WAS ...

  2. 第十八章 Caché 命令大全 NEW 命令

    文章目录 第十八章 Caché 命令大全 NEW 命令 重点 大纲 参数 描述 NEW的限制 参数 pc variable 示例 注意 使用`NEW`功能的位置 `new`和`kill` `Inclu ...

  3. 类 workbooks 的 open 方法无效_第十九章 Cach 命令大全 OPEN 命令

    第十九章 Caché 命令大全 OPEN 命令 获取输入/输出操作的设备或文件的所有权. 重点 打开设备要指定延迟秒,否则将无限等待. 大纲 OPEN:pc device:(parameters):t ...

  4. 第二十章 Caché 命令大全 QUIT 命令

    文章目录 第二十章 Caché 命令大全 QUIT 命令 重点 大纲 参数 描述 在程序代码中 无参数`QUIT` 带参数QUIT 在终端提示下 参数 pc expression 示例 注意 `QUI ...

  5. 第二十三章 Caché 命令大全 SET 命令

    文章目录 第二十三章 Caché 命令大全 SET 命令 重点 大纲 参数 描述 将多个变量设置为相同的值 设置多个变量的限制 参数 pc variable value JSON值 JSON对象 JS ...

  6. 第三十七章 Caché 命令大全 ZWRITE 命令

    文章目录 第三十七章 Caché 命令大全 ZWRITE命令 重点 大纲 参数 描述 `ZWRITE`不带参数 `ZWRITE`带参数 Variables Non-Display Characters ...

  7. 【正点原子MP157连载】第二十八章 Linux并发与竞争实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  8. eNSP命令大全(所有命令)

    eNSP命令大全(所有命令) 命令符 从用户视图切换到系统视图 system–view 从系统视图切换到用户视图 quit 连入接口命令 interface IP地址.子网掩码配置命令 ip addr ...

  9. 第二十八章:化学学校

    第二十八章:化学学校 "后面的礼品,就算是之前的谢礼吧,如果以后还有类似的事情,只要你们做到,那么我崔门必将重谢!"崔门说道. "那到底该如何扼杀隐患呢?"李淳 ...

最新文章

  1. tensorflow随笔-读文件
  2. 编写函数实现有序数组的二分查找
  3. java语法优化小结
  4. vc++6.0中创建工程时选Win32 Application和Win32 console Application的区别
  5. 2017 JavaScript生态圈调查报告
  6. 计算机网络技术云计算简历模板,云计算平台师个人简历模板
  7. html5改变窗口大小,js怎么改变窗口大小?js改变窗口大小方法
  8. 高等数学期末总复习 DAY6.洛必达求极限、不等式单调性证明、判断拐点、曲率以及曲率半径
  9. oppo开启系统更新服务器,oppo手机系统升级开不了机怎么办
  10. 搞定这套 Python 爬虫面试题,面试会 so easy
  11. AWS云计算题目总结
  12. 代码实现微信8.0特效
  13. 笔记本计算机屏幕亮度暗,笔记本屏幕暗,详细教您怎么解决
  14. 450分学计算机能上的二本学校,高考考了450分能上什么大学 450分左右的理科大学有哪些...
  15. android运行模拟器时出现Unfortunately xxx has stopped的解决办法
  16. Pygame 官方文档 - 中译版
  17. shell编程经典案例,建议收藏
  18. 主梁弹性模量计算_4主梁作用效应计算-金锄头文库
  19. 计算机控制接口板设计,计算机控制实验报告(过程接口板设计)
  20. AIOC工具箱授权码2021-01-29日到期

热门文章

  1. 【ASP.NET教程-WP教程15】ASP.NET Web Pages - C# 和 VB 实例简单而强大的开发框架,可用于构建动态的、基于Web的应用程序。它提供了一种轻量级的方式来创建和管理网页
  2. 两数之和,梦开始的地方
  3. Android手机崩溃日志查看
  4. Unreal Engine学习(一些稀碎的知识)
  5. 应付账款账龄分析模板_应收账款账龄分析表下载
  6. 使用echarts完成市级的图表
  7. 基于arduino单片机智能避障小车
  8. 自用的快速复习Java基础知识,不适用于每一个人
  9. RK3568开发笔记(四):在虚拟机上使用SDK编译制作uboot、kernel和buildroot镜像
  10. 关于unity3d调用手机摄像机的一些操作