暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

File JRN事务处理机制解析

啊皮 2021-07-29
1039

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

        会有详细的列表。



        文章转载自啊皮,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

        评论