首页 > 编程知识 正文

32位的程序最大寻址空间,老子第十四章

时间:2023-05-06 15:00:36 阅读:21433 作者:4627

文章目录第14章Cach事务管理APP应用程序中的事务命令在事务中使用锁定在事务中使用` $INCREMENT '和` $ sequence ' APP应用程序中的事务回调APP应用程序中的事务示例自动事务回滚事务使用全系统问题事务的备份和日志异步错误通知

第十四章Cach事务处理

事务是逻辑工作单位。 事务有助于维护数据库的逻辑完整性。

例如,如果要将资金从一个帐户转移到另一个帐户,银行必须从一个表中的字段中减去金额,然后将相同的金额添加到另一个表中的字段中。 通过指定两个更新形成一个事务,可以查看是同时执行这两个操作,还是不执行这两个操作。 这意味着一个操作不能在没有另一个操作的情况下执行。

在APP应用程序中,单个SQL INSERT、UPDATE、DELETE语句或单个全局SET或KILL语句本身可能不构成完整的事务。 在这种情况下,可以使用事务命令定义组成完整事务的一组操作。 命令标记事务的开始如果有多个命令序列,则另一个命令标记事务的结束。

事务通常是整体执行的。 如果事务因程序错误或系统故障而不完整,请回滚已完成的事务部分。

APP应用程序开发者必须在APP应用程序中处理事务回滚。 Cach还可以在发生系统故障或各种情况下自动处理事务回滚。

如果设置了日志回滚配置选项,则Cach将在cconsole.log文件中记录回滚。 可以使用管理入口、系统操作和系统日志选项查看cconsole.log:[ :“主页”“系统日志”“查看控制台日志”。

管理APP应用程序中的事务在Cach中,可以使用以下方法之一定义APP应用程序中的事务

对于宏源实例的SQL语句Cach ObjectScript命令,组成事务的数据库更改为SQL INSERT、UPDATE、DELETE语句、Cach ObjectScript set和kill命令

事务命令Cach支持ANSI SQL操作、COMMIT WORK和ROLLBACK WORK (在CachSQL中,关键字WORK是可选的)。 它还支持Cach SQL扩展设置事务、开始事务、保存点和%INTRANS。 此外,Cach还实现了属于M Type A标准的事务命令。

下表总结了这些SQL和Cach ObjectScript命令。

SQL命令ObjectScript命令定义SET TRANSACTION设置事务参数而不启动事务。 开始事务处理开始标记事务处理的开始。 %INTRANS$TLEVEL检测事务当前是否正在进行。 0由%Intran使用,表示正在进行事务处理,但日志记录无效。 $TLEVEL未使用。 0表示不在事务中。 0显示在事务中。 保存点在事务中标记点。 可用于部分回滚到保存点。 COMMITTCOMMIT表示事务成功完成。 ROLLBACKTROLLBACK发出事务未正常结束的信号; 必须回滚或撤消自事务启动以来执行的所有数据库更新。 这些ObjectScript和SQL命令是完全兼容和兼容的。 但是,以下情况除外:

如果没有当前事务,则ObjectScript TSTART和SQL START TRANSACTION将启动事务。 如果需要与33558www.Sina.com/SQL标准兼容,请使用开始翻译。

cachmultivaluebasic(mvbasic ) TRANSACTION命令也与ObjectScript和SQL TRANSACTION命令兼容。

在访问事务中使用锁定的多个进程可能访问的全局数据库时,必须在该全局数据库中使用LOCK命令保护数据库的完整性。 发布与全局变量对应的锁定,更改全局变量的值,然后解除锁定。 LOCK命令可锁定和解锁指定的锁定。 尝试更改全局值的其他进程请求锁定,直到第一个进程解除锁定。

在事务中使用锁定时,有三个重要注意事项:

锁定/解锁操作不会回滚。 在事务处理中,解锁进程拥有的锁定可能会出现以下两种情况之一: 锁定会立即解除锁定。 此锁可以立即在另一个进程中获取。 被置于锁定被解除的状态。 已解除锁定,但在当前事务处理完成之前,无法在其他进程中检索。 如果解除锁定,Cach将推迟解除锁定,直到提交或回滚事务。 在事务中,锁定看起来处于解锁状态,后续锁定可以具有相同的值。 但是,在事务外部,锁定仍然是锁定的。

但是,START TRANSACTION不支持嵌套事务。因此,如果需要(或可能需要)嵌套事务,最好使用TSTART启动事务。事务中使用$INCREMENT和$SEQUENCE调用$INCREMENT或$SEQUENCE函数不被视为事务的一部分。 这些函数可以用于获取索引值,而无需使用LOCK命令。 这个可能不想在办公期

间锁定全局计数器的事务是有利的。

$INCREMENT按照从一个或多个进程接收增量请求的顺序分配各个整数值。

$SEQUENCE为多个进程提供了一种快速获取同一全局变量的唯一(非重复)整数的方法,方法是为每个递增进程分配一个整数值序列(范围)。

注意:$INCREMENT可以由事务内的一个进程递增,当该事务仍在处理时,可由并行事务中的另一个进程递增。如果第一个事务回滚,则可能会有一个“跳过”的增量,从而“浪费”一个数字。

应用程序内的事务回滚

如果在事务处理过程中遇到错误,可以通过三种方式回滚:

发出SQL ROLLBACK命令,回滚工作发出Caché ObjectScript回滚命令,TROLLBACK回调%ETN

注意:回滚事务时,任何默认类的IDKey都不会递减。相反,IDKey的值由$INCREMENT函数自动修改。

发出SQL或Caché ObjectScript回滚命令。

应用程序开发人员可以使用两种类型的回滚命令来指定事务的未成功结束,并自动回滚未完成的事务:

在宏源例程中使用 ##sql(ROLLBACK WORK)。在宏或中间源代码中使用Caché ObjectScript TROLLBACK命令。

ROLLBACK命令必须与错误陷阱协作,如下例所示:

/// d ##class(PHA.TEST.ObjectScript).TestTRO()ClassMethod TestTRO(){ROU ##sql(START TRANSACTION) set $ZT="ERROR" SET ^ZGLO(1)=100 SET ^ZGLO=error SET ^ZGLO(1,1)=200 ##sql(COMMIT WORK) Write !,"Transaction Committed" QuitERROR ##sql(ROLLBACK WORK) Write !,"Transaction failed." Quit} DHC-APP>d ##class(PHA.TEST.ObjectScript).TestTRO() Transaction failed.

删除 SET ^ZGLO=error 代码

Transaction Committed

在示例代码中,$ZT设置为在提交事务之前发生程序错误时运行子例程错误。行ROU开始事务并设置错误陷阱。ROU+1和ROU+3行设置全局^ZGLO的节点。但是,如果变量ERROR未定义,则ROU+2会导致程序错误,并且ROU+3行不会执行。程序执行转到子例程错误,并且^ZGLO(1)的集合被撤消。如果删除ROU+2行,则^ZGLO将在两次中都设置其值,事务将被提交,并且将写入消息“Transaction Submitted”。

DHC-APP>d ##class(PHA.TEST.ObjectScript).TestTRO() Transaction failed.DHC-APP>zw ^ZGLO

删除 SET ^ZGLO=error 代码 再次运行发现zw ^ZGLO有值

DHC-APP>d ##class(PHA.TEST.ObjectScript).TestTRO() Transaction CommittedDHC-APP>zw ^ZGLO^ZGLO(1)=100^ZGLO(1,1)=200 回调ETN

如果尚未使用ROLLBACK命令处理事务回滚,则错误捕获实用程序%ETN会检测未完成的事务,并提示用户提交或回滚事务。应该在应用程序中处理回滚,因为提交不完整的事务通常会降低逻辑数据库的完整性。

如果在事务处理过程中出现错误后运行%ETN,则会显示以下回滚提示:

You have an open transaction.Do you want to perform a Commit or Rollback?Rollback =>

如果在10秒超时时间内没有响应,则系统默认为回滚。在job或应用程序模式job中,事务回滚时不显示任何消息。

%ETN本身不执行任何触发事务回滚的操作,但它通常以停止 Caché 结束。当暂停 Caché ObjectScript,并且系统运行%HALT以执行 Caché进程清理时,将发生事务回滚。有一个进入%ETN的入口点,称为back^%ETN,它以退出结束,而不是停止。如果例程回调^%ETN,而不是^%ETN或FORE^%ETN,它将不会在错误处理过程中执行事务回滚。

应用程序内的事务处理示例

下面的示例显示如何在宏源例程中处理事务。它使用SQL代码执行数据库修改。SQL语句将资金从一个帐户转移到另一个帐户:

Transfer(from,to,amount) // Transfer funds from one account to another{ TSTART &SQL(UPDATE A.Account SET A.Account.Balance = A.Account.Balance - :amount WHERE A.Account.AccountNum = :from) If SQLCODE TRollBack Quit "Cannot withdraw, SQLCODE = "_SQLCODE &SQL(UPDATE A.Account SET A.Account.Balance = A.Account.Balance + :amount WHERE A.Account.AccountNum = :to) If SQLCODE TROLLBACK QUIT "Cannot deposit, SQLCODE = "_SQLCODE TCOMMIT QUIT "Transfer succeeded"} 自动事务回滚

在执行以下操作期间会自动执行事务回退:

Caché 启动,如果需要恢复。当启动Caché并确定需要恢复时,计算机上任何未完成的事务都将回滚。使用HALT命令(对于当前进程)或^RESJOB实用程序(对于其他进程)终止进程。停止后台作业(非交互进程)会自动回滚当前正在进行的事务中所做的更改。暂停交互进程会提示是提交还是回滚当前正在进行的事务中所做的更改。如果在程序员模式用户进程上发出^RESJOB,系统会向用户显示一条消息,询问他们是希望提交还是回滚当前事务。

此外,系统管理员还可以通过运行 ^JOURNAL 实用程序回滚特定于群集的数据库中的未完成事务。从^JOURNAL实用程序主菜单中选择“从日记还原全局参数”选项时,将还原日记文件,并回滚所有未完成的事务。

事务处理的系统范围问题

本节介绍与事务处理相关的各种系统范围问题。

使用事务处理进行备份和日志记录

在实现事务处理时,请考虑以下备份和日志记录过程。

Caché的每个实例都有一个日志。日志是一组文件,它们保存自上次备份以来对数据库所做更改的按时间顺序的日志。Caché事务处理与日志记录配合使用,以维护数据的逻辑完整性。

日志包含事务处理中全局变量的设置和取消操作,而不考虑受影响的全局变量所在的数据库的日记帐设置,以及全局日志状态设置为“Yes”的数据库中的全局变量的所有设置和取消操作。

可以在事务处理期间执行备份;但是,生成的备份文件可能包含部分事务。如果发生需要从备份还原的灾难,请首先还原备份文件,然后将日记文件应用到数据库的还原副本。应用日记文件可以还原从备份时到灾难发生时的所有日志更新。要通过完成部分事务和回滚未提交的事务来恢复数据库的事务完整性,必须应用日记,因为数据库在备份时可能已包含部分事务。

异步错误通知

可以使用%SYSTEM.Process的AsynchError()方法指定job是否可以因异步错误而中断:

%SYSTEM.Process.AsynchError(1)启用异步错误接收。%SYSTEM.Process.AsynchError(0)禁用异步错误接收。

Config.Miscellous类的AsynchError属性为新进程设置系统范围的默认值,以确定进程是否愿意被异步错误中断。默认为1,表示“是”。如果检测到特定JOB的多个异步错误,系统将触发至少一个此类错误。但是,不能保证会触发哪个错误。

目前实现的异步错误包括:<LOCKLOST>-此JOB曾经拥有的某些锁已重置。<DATALOST>-此JOB执行的某些数据修改从服务器收到错误。<TRANLOST>-此JOB启动的分布式事务已被服务器异步回滚。

即使禁用接收异步错误的作业,该作业下次执行ZSync命令时也会触发异步错误。

在每个TStart、TCommit或Lock操作,以及在每个网络全局引用处,Caché都会检查挂起的异步错误。由于网络上的SET和KILL操作是异步的,因此在生成SET和报告异步错误之间可能会插入任意数量的其他指令。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。