JRN, journal的缩写,中文翻译是日志,日记,通俗来讲就是记录对某个object的所有操作(增删改查),不过对于IT人员,最常用的还是针对PF的journal,所以接下来的内容,我们将只讨论PF的journal.
1> 为什么要用journal?是不是所有的file都需要加journal呢,其实也是需要根据实际项目来的,我只能说你都加Journal也不会影响程序运行,只是会储存很多的log在系统,譬如某个中间working file, 或者control file不太容易更改的,一般都不需要加journal.
有个很经典的例子,
譬如程序需要更新两个file,第一个file 更新成功了,到第二个file 更新的时候失败了,这时候如果退出程序,如果没有用到Journal事物处理机制,那么第一个file的数据是不会回滚的。
2> 怎么创建journal呢,
1> CRTJRNRCV (生成一个容器,用来存放journal)2> CRTJRN (生成一个journal,用来监控file,一个jrounal可对多个file)3> STRJRNPF(顾名思义,将file和journal 联系起来)4> STRCMTCTL(启动事务处理机制,程序里用到COMMINT/ROLBK 必备)5> ENDCMTCTL(结束事务处理机制)6> 程序里定义File 记得加个关键字 COMMIT. 更新完数据用commit.
3> JRN 和PF,对应的需要在通一个ASP里面,具体看object在哪个ASP device,可以用Command DSPOBJD
4> Strjrnpf 有个比较重要的参数,一般建议填写*BOTH.
Record image:
*AFTER
Only after images are written to the journal for changes to records in this file.
*BOTH
The system writes both before and after images to the
journal for changes to records in this file.

5> STRCMTCTL, 这个command,太太太重要了,里面的某些参数直接决定了程序的运行,甚至是影响效率!

Lock Level:
* CHG 当RPG程序里F 行定义成UF 的时候,当程序有使用到某个record的时候就会lock住,直接commit之前都会被lock住,这也就需要大家当在写批处理作业的时候,需要留意lock影响,一般如果别的作业不需要修改数据的话,可以使用不同名的LF,即可避免lock 导致作业异常
* CS 程序里的read record不会lock
*all 程序里对record的任何操作都会lock住file. 无论file 定义成IF/UF。
Commitment level:
*ACTGRP *JOB, 前面有文章详细介绍这两个的区别。
6> 程序里执行了rolbk的话,会把更新的操作全部回滚回去。为什么能回滚回去,就是因为在journal里存放了历史的数据,具体如何看journal 的历史记录,可以用DSPJRN,如果有需要,可以选择output file 为*OUTFILE,就方便用SQL QRY做相应的查询:
7> 关于如何查看journal:


CODE TYPE: 指明具体的level/操作类型,譬如R 是record Level, UB 是before image(前提是STRJRNPF 用了*both),UP 是after image
然后看到时间,还有哪个job ,通过什么方式改了某个file 的某个member.
最最关键的,最后一个字段specific data,会存放before after image.某些关键时候的救火就指望这个了。划重点:DSPJRN OUTPUT(*) 和OUTPUT(*OUTFILE) 看到的不太一样,type1显示的内容又点意外呢,可以试试用以下command:
具体可以去看IBM官网搜索五个不同type的区别。
重点关键字:
重点关键字:
重点关键字:
OUTFILFMT(*TYPE3)
ENTDTALEN(*VARLEN 500 100)
NULLINDLEN(25)
DSPJRN JRN(JRN001) FILE((LIB/SPLF)) OUTPUT(*OUTFILE) OUTFILFMT(*TYPE3)OUTFILE(QTEMP/TEMP3) ENTDTALEN(*VARLEN 500 100) NULLINDLEN(25)
8>
补充一个Create SQL ILE RPG Object (CRTSQLRPGI), 里面有一个commitment control.
如果SQLRPGLE程序需要用到事物处理机制,此处的参数不能用*none,除非在程序里用代码声明了用commit
control,不知道怎么声明的google去,不然编译运行后果你懂的。

++++++++以下列出Journal Code 所有类型:
Journal code D (database file-level information entries).
Journal code E (data area information entries).
Journal code F (file member-level information entries).
Journal code Q (data queue information entries).
Journal code R (record-level information entries).
Journal code U (user-generated entries).
Journal code Y (library information entries).
++++++++++具体所有type含义,后台回复 JRN
会有详细的列表。




