Commit、Rollback

原文: http://qlcc.blog.163.com/blog/static/4493977320078751730693/

数据库文件是AS/400中类型为*FILE的Object;它们既可以是PF又可以是LF,既可以是外部描述,又可以是程序描述。

访问数据库文件时使用落实控制(COMMIT/ROLBK),可以确保对数据库文件操作的以下两个结果之一:

1、全部数据库文件操作都是成功的(落实操作);

2、全部数据库文件操作都是无效的(取消操作).

用这种方法,从而保证了数据库文件的完整性;另外,可以把一组操作当作一个单元来处理。

使用落实控制,要做:

在AS/400上:

1、使用落实控制的准备:用CL命令CRTJRN(生成日志)、CRTJRNRCV(生成日志接收器)和STRJRNPF(日志物理文件).

2、通知AS/400启动和结束落实控制的时间:用CL命令STRCMTCTL(启动落实控制)和ENDCMTCTL(结束落实控制).

   ●落实控制琐:

   在STRCMTCTL命令中,要注意指定一个上锁级别,LCKLVL(*ALL),LCKLVL(*CHG)或LCKLVL(*CS),当你的程序在落实控制下操作,并且对一个文件的记录已在落实控制下进行了I/O(输入/输出)处理,记录由落实控制加锁。

   ●落实控制范围:

   当用STRCMTCTL命令启动落实控制时,系统建立一个落实定义。落实定义包括作业中落实控制下修改的资料信息;

落实定义只适用于发出STRCMTCTL命令之后的作业并且在发出ENDCMTCTL命令结束。

   落实定义范围指出了作业中哪些程序要使用落实控制,落实定义范围在活动组级或作业级。

   缺省的落实定义范围是发出STRCMTCTL命令的程序所在的活动组,也就是活动组级。只在这个活动组中运行的程序

才能使用落实定义。

   OPM程序将使用*DFTACTGRP落实定义;ILE程序用与之有关的活动组。

   你可以在STRCMTCTL命令的落实范围参数CMTSCOPE上指定落实定义的范围。

在RPG程序中:

1、在要做落实控制文件的文件描述规范表上指出落实控制(COMMIT).

2、用COMMIT落实操作码实施对在落实控制下数据库文件的一组修改,或者用ROLBK取消操作码对在落实控制下

   数据库文件的一组修改。

★注:落实控制只适用于数据库文件。

[举例]

▲<例1>;这个例子解释了在落实控制下程序所用的规范表和CL命令:

※要准备使用落实控制,发出下列CL命令:

1、CRTJRNRCV JRNRCV(RECEIVER)

这个命令生成一个名为REVEIVER的日志接收器.

2、CRTJRN JRN(JOURNAL) JRNRCV(RECEIVER)

这个命令生成一个名为JOURNAL的日志,并连接名为RECEIVER的日志接收器.

3、STRJRNPF FILE(HLIB) JRN(JOURNAL)

这个命令把文件MASTER和TRANS的日志项记到日志JOURNAL中.

※在程序中,为文件HLIB指出COMMIT.
 * PGQL/PCOMMIT/HCOMMIT.rpgle                                                                     
 * Commit ROLBK   练习程序                                             
 *                                                                     
 *                                                                     
FHLIB      UF A E           K DISK    COMMIT
 *                                                                                                                        
 *              
C                   EXSR      #Main                                    
C                   SETON                                          RTLR
 *                                                                     
 *****************************************************                 
 *  主程序                               
 *****************************************************                 
CSR   #Main         BEGSR                                              
C                   EXSR      #Open                                    
C                   EXSR      #Write                                   
C                   EXSR      #Close                                   
CSR                 ENDSR                                              
 *                                                                    
 *******************************************************
 * WRITE                                                              
 *******************************************************
CSR   #Write        BEGSR                                             
C                   EVAL      USRID  = '1'                            
C                   EVAL      NAME   = 'HOHO'                                                   
C                   WRITE     EMPSAV                               88 
C                   IF        *IN88  = *ON                            
C     'WRT_ERROR'   DSPLY                                             
 * 使用COMMIT操作,如果成功,做完整的一组操作;如果不成功,撤   
 *  消所有修改。                                                      
 *                                                                    
C                   UPDATE    EMPSAV                               90 
C                   IF        *IN90                                   
C                   ROLBK                                             
C                   ELSE    
C                   COMMIT                                            
C                   ENDIF                                             
C                   ENDIF                                             
 *                                                                    
CSR                 ENDSR                                             
 ****************************************************                 
 * Open File                                                          
 ****************************************************                 
CSR   #Open         BEGSR                                             
C                   IF        NOT %OPEN(HLIB)                         
C                   OPEN      HLIB                                    
C                   ENDIF                                             
 *                                                                    
CSR                 ENDSR                                             
 ****************************************************                 
 * Close File                                                         
 ****************************************************                 
CSR   #Close        BEGSR                                             
C                   IF        %OPEN(HLIB)                             
C                   CLOSE     HLIB
C                   ENDIF
 *                       
CSR                 ENDSR
                                                                                                           
※要在落实控制下操作程序,发出命令:

1、STRCMTCTL LCKLVL(*ALL) CMTSCOPE(*JOB)

这个命令启动带有最高级锁定的落实控制.

2、CALL REVIST (没用过,不知道怎么用?)

这个命令调用REVIST命令.

3、ENDCMTCTL

这个命令结束落实控制,并产生一个隐含的ROLL BACK操作.
▲<例2>;:有条件的落实控制例子(这个例子还没用过07.08.07):
       可以编写一个程序来控制打开一个运行时做落实控制的文件。通过完成有条件落实控制,可不用写出两套相同的程序:一套在落实控制下执行,另一套不在落实控制下执行。
       COMMIT键字有一个可选参数,它允许你指定有条件的落实控制。在这个文件的文件描述规范表的键字区输入COMMIT键字。ILE RPG/400编译程序定义一个1个字节的与参数中规定的同名字符型字段;如果参数为1,文件就在落实控制下运行。

   COMMIT键字参数必须在文件打开之前设置。可以在调用程序时传递一个值来设置,也可以在程序中直接设为"1"。

   对于共享式打开,如果文件已经打开了,即使COMMIT键字参数设为1也没有作用。

--------------------------------------------------------------------------------

FMASTER    UF   E       K       DISK         COMMIT(COMMITFLAG)

FTRANS     UF   E       K       DISK         COMMIT(COMMITFLAG)

C*  如果COMMITFLAG='1',文件在落实控制下打开,否则不是.

C   *ENTRY        PLIST

C                 PARM                          COMMITFLAG

C                 :

C                 :

c*

C*  使用COMMIT操作,如果成功,做完整的一组操作;如果不成功,撤消所有修改;

C*  仅可在文件是在落实控制打开时,才能用COMMIT和ROLBK操作(即COMMITFLAG='1').

C*

C                  UPDATE       MAST_REC                 90

C                  UPDATE       TRAN_REC                 91

C                  IF           COMMITFLAG='1'

C

C                  IF           *IN90 OR *IN91

C                  ROLBK

C                  ELSE

C                  COMMIT

C                  ENDIF

C

C                  ENDIF

---------------------------------------------------------------------------------

最后,提提程序周期中的落实控制:

   落实控制是给全过程文件用的,对主文件和次文件不使用落实控制。它的输入输出是在程序员的控制下,是由RPG

程序周期控制,原因如下:

●在程序中不能为最后总计输出发出一个COMMIT操作;

●周期内的程序从一个上锁记录条件中恢复是困难的;

●级别指示器不能由ROLBK操作更新设置;

●一个ROLBK操作以后,处理匹配记录可能产生一个顺序错误。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值