事务

COMMIT 提交当前事务.所有事务的更改都将为其他事务可见,而且保证当崩溃发生时的可持续性。在程序中经常使用 COMMMIT 来控制事物处理的完整性,保证在发生异常的情况下数据的完整性和正确性。访问数据库文件时使用 COMMIT/ROLBK,可以确保对数据库文件操作的一致性:全部数据库文件操作都是成功的 COMMIT 提交;全部数据库文件操作都是无效的 ROLBK 回滚. 用这种方法,从而保证了数据库文件的完整性;另外,可以把一组操作当作一个单元来处理。
举个实际的例子,如果程序中,以修改的方式声明了四个文件 A、B、C、D,其中 A、B、C 都使用了 COMMIT 关键字,而 D 未使用 COMMIT 关键字;在程序执行过程中,首先更改了 A、B、D 的值在接下的处理中,如果业务流程判断,逻辑有误,不再执行,此时可以进行回滚操作,此时 A、B 的数据恢复成为修改之前的数值;D 的数据,因为在声明文件时未使用 COMMIT 关键字,所以回滚操作对它无效,即 D 的数据仍然保持修改之后的值;而如果业务流程判断正常,程序顺利执行完毕,此时需要进行一次确认操作(COMMIT),来落实数据的修改。通常,我们称 COMMIT 为提交确认操作(也可称之为落实操作),与回滚操作,统称为“事务处理”

使用方法

  1. 生成一个日志接收器(CRTJRNRCV)
  2. 生成一个日志,并将该日志连接之前建立的日志接收器(CRTJRN)
  3. 将需要声明的文件,增加到上面已建立的日志中(STRJRNPF),只增加 PF 文件即可,不需要增加相应的 LF 文件;一个 PF 文件只用增加一次。
  4. 对于当前进程,执行启用日志的命令 STRCMTCTL LCKLVL(*ALL)(对于同一进程,执行一次即可,通常在签到时由公共程序来执行)
  5. 在程序中,对声明的文件,填加 COMMIT 关键字
  6. 在执行完修改操作语句后,执行事务处理。

步骤 1、2、3 通常由系统管理人员来执行,对于普通程序员而言,不需要理会。不过需要注意,一个 PF 文件如果重新编译之后,系统会自动将它从日志中去掉,所以在重新编译过 PF文件之后,需要执行STRJRNPF 命令将它再加到日志中去。(当然,新增的 PF 文件,如果需要进行日志处理,也是要加到日志中去的)
而步骤 4,一般是隐含在登录程序中执行的。登录程序可以 CHGUSRPRF 命令来查看。再引申一下,对于使用SBMJOB 命令提交后台执行的程序而言,因为 SBMJOB 是提交产生了一个新进程,这个新进程未执行签到程序,所以如果运行的程序有用到事务处理的话,将会报错。解决之道是在这个新进程中,执行业务处理程序之前,先执行一次签到程序,或执行 STRCMTCTL 命令。