논리적 작업 단위

non-recoverable 자원(예: Windows 2000의 직렬 파일)을 변경하는 경우, 해당 변경은 상대적으로 영구적입니다. 사용자의 코드와 EGL 런타임 서비스는 모두 알림 없이 변경을 취소할 수 없습니다. recoverable 자원(예: 데이터베이스)을 변경하는 경우, 사용자의 코드 또는 EGL 런타임 서비스는 변경사항을 커미트하여 영구적으로 만들거나 변경사항을 롤백하여 마지막으로 커미트했던 변경사항의 컨텐츠로 되돌릴 수 있습니다.

다음 자원을 복구할 수 있습니다.
  • 관계형 데이터베이스
  • 복구 가능하도록 구성된 CICS® 큐 및 파일
  • DL/I 데이터베이스 및 GSAM 파일(일부 경우)
  • WebSphere® MQ 메시지 큐(MQ 레코드가 다르게 지정하지 않는 경우)
  • 대체 PCB로 지정된 출력. 대체 PCB는 대상 시스템이 IMS™ BMP 또는 IMS/VS인 경우에 사용 가능
논리적 작업 단위는 하나의 그룹으로 커미트되거나 롤백되는 입력 조작을 식별합니다. 작업 단위는 사용자의 코드가 복구 가능한 자원을 변경할 때 시작되며 다음 이벤트 중 첫 번째가 발생할 때 종료됩니다.
  • 사용자의 코드는 sysLib.commit() 또는 sysLib.rollback() 시스템 함수를 호출하여 변경사항을 커미트하거나 롤백합니다.
  • EGL 런타임 서비스는 사용자의 코드에서 처리되지 않는 하드웨어 오류에 응답하여 롤백을 수행합니다. 이 경우 실행 단위에 있는 모든 프로그램은 메모리에서 제거됩니다.
  • 다음과 같은 경우 암시적 커미트가 발생합니다.
    • 실행 단위가 성공적으로 종료됩니다. 실행 단위의 내용을 참조하십시오.
    • 프로그램이 show 문을 실행합니다.
    • 프로그램이 다음과 같이 구별하여 transfer to transaction 문을 실행합니다.
      • CICS 또는 IMS/VS에서 실행되는 프로그램에서 전송은 항상 커미트를 유발합니다.
      • 다른 프로그램에서 전송은 synchOnTrxTransfer 빌드 디스크립터 옵션의 값이 YES인 경우에만 커미트를 유발합니다.
    • 텍스트 UI 프로그램은 해당 프로그램이 세그먼트된 프로그램으로 작동하는 경우 converse 문을 실행합니다.

프로그램이 트랜잭션 환경(CICS, IMS 또는 iSeries)에서 실행되는 경우, EGL은 실행 단위 내의 모든 자원 관리자와 모든 프로그램에서 통합된 2단계 커미트를 수행하는 환경 커미트를 실행합니다. 비트랜잭션 환경에서 EGL은 복구 가능한 각 자원 관리자를 개별적으로 호출하는 단일 단계 커미트를 수행합니다.

프로그램이 z/OS® 일괄처리에서 실행되고 DB2®에 액세스하는 경우 RRSAF 환경에서 실행할 수 있습니다.
  • 이 기능을 사용하려면 ELACPIOP 샘플 JCL을 사용하여 ELARPIOP의 새 버전을 생성하십시오. ELACPIOP 샘플 JCL은 zSeries용 IBM® Rational® COBOL Runtime 제품의 사용자 정의 중에 작성되는 ELAJCL 데이터 세트입니다.
    두 가지 선택사항이 있습니다.
    • 프로그램 디렉토리의 섹션 6.2.1.2.2에 지정된 설치 사용자 정의를 반복하십시오. 또는
    • 다음과 같이 RRSAF=Y 매개변수를 추가하여 ELACPIOP JCL을 수정하십시오.
      ELARMIOP NLS=ENU,EOF=N,SCFOLD=Y,IMSESA=N,SEGMSG=N,            X
        MSGTRN=ELAE,TRBUF=64,TSQUE=32,RRSAF=Y  
  • 다음 파일은 RRSAF를 사용할 수 있도록 변경되어야 합니다.
    • 사용자 프로그램의 사전 컴파일에 사용되는 JCL 또는 EGL 빌드 스크립트
    • 일괄처리 작업을 실행하는 데 사용되는 실행 JCL

    추가적인 세부사항은 DB2 RRSAF 문서에 있습니다.

  • 앞에서 설명한 EGL 지원은 암시적 RRSAF 데이터베이스 연결에만 사용됩니다. RRSAF 하에서 코드를 실행할 때 명시적 데이터베이스 연결을 사용하려면 EGL 프로그램을 업데이트해야 합니다.

    추가적인 세부사항은 DB2 RRSAF 문서에 있습니다.

다음 고려사항은 EGL 및 비EGL 프로그램의 상호작용에 적용됩니다.
  • EGL 프로그램이 비EGL 프로그램을 호출하고 두 프로그램이 SQL 테이블에 액세스할 때 비EGL 프로그램이 커미트 또는 롤백을 유발하는 경우 호출 전에 모든 커서를 닫아야 합니다.
  • 비트랜잭션 환경에서 실행 단위의 EGL 프로그램이 SQL을 수행하지 않지만 SQL I/O를 수행하는 비EGL 프로그램으로 전송되거나 호출하는 경우, EGL은 실행 단위의 끝에서 커미트를 실행하지 않습니다.
다른 데이터베이스에 동적으로 연결할 수 있는 sqlLib.connect() 또는 vgLib.connectionService() 시스템 함수를 호출하는 경우, sysLib.commit() 또는 sysLib.rollback()의 호출보다 먼저 호출하십시오.

호환성

표 1. 작업 단위에 대한 호환성 고려사항
플랫폼 문제
Java™ 생성
  • Java 프로그램이 하드 오류로 종료되는 경우, 그 효과는 롤백을 수행하고 커서를 닫고 잠금을 해제하는 것과 동등합니다.
  • 실행 단위가 정상적으로 종료되는 경우, EGL은 커미트를 수행하고 커서를 닫고 잠금을 해제합니다.
  • 다중 연결을 사용하여 다중 데이터베이스에서 읽을 수 있지만 한 작업 단위에서는 단일 단계 커미트만 사용 가능하므로 둘 이상의 데이터베이스를 업데이트하지는 않습니다. 자세한 정보는 connect()의 내용을 참조하십시오.
  • 원시 및 생성된 Java의 혼합을 쓰는 중에 실행 단위에서 이전에 작성된 SQL 데이터베이스 변경사항을 커미트해야 하는 경우 "SharedResourcePowerServer"에서 설명하는 Java 클래스를 사용할 수 있습니다.
CICS
CICS 실행 단위에서는 한 번에 하나의 DB2 UDB 데이터베이스만 사용 가능합니다. 다음과 같은 방식으로 자동 처리가 발생합니다.
  • 프로그램이 하드 오류로 종료되는 경우 EGL 런타임 서비스는 롤백을 수행하고 커서를 닫고 잠금을 해제합니다.
  • 실행 단위가 정상적으로 종료되는 경우, 조치가 발생하지 않도록 호출자가 요청하지 않으면 CICS는 커미트를 수행하고 커서를 닫고 잠금을 해제합니다. 예를 들어, 이러한 조치는 Java 코드가 EGL CICS 프로그램에 액세스하고 호출에 대한 연계 옵션 파트가 Java 코드가 논리적 작업 단위를 처리함을 표시하는 경우에는 발생하지 않습니다. 이 경우 논리적 작업 단위를 클라이언트 작업 단위라고 합니다. 자세한 정보는 EGL 생성 안내서를 참조하십시오.
커미트는 DL/I 처리와 관련된 다음 경우에 발생합니다.
  • 호출된 프로그램의 매개변수 목록에 PCB 또는 PSB의 주소가 포함되지 않은 경우, DL/I에 액세스하는 EGL에 의해 호출된 프로그램은 호출하는 프로그램으로 돌아갑니다.
  • PSB는 현재 스케줄되었으며 EGL 프로그램은 transfer to program을 사용하여 전송하고 다음 조건 중 하나가 적용됩니다.
    • 비EGL 및 비VisualAge Generator 프로그램으로 전송됩니다.
    • synchOnPgmTransfer 빌드 디스크립터 옵션은 전송 프로그램에 대해 YES으로 설정됩니다.
    • synchOnPgmTransfer 빌드 디스크립터는 전송 프로그램에 대해 NO로 설정되며 전송 프로그램의 PSB 레코드에서 참조되는 기본 PSB는 대상 프로그램의 PSB 레코드에서 참조되는 기본 PSB와 다릅니다. (전송 프로그램이 CICS와 IMS/VS 둘 다에 대해 생성될 때 동작의 차이를 최소화하려면 synchOnPgmTransfer 빌드 디스크립터 옵션을 NO로 설정하십시오.)
IMS BMP
sysLib.commit()는 프로그램이 I/O PCB와 연관된 직렬 파일을 읽기 위해 get next 문을 사용하는 트랜잭션 중심 BMP 프로그램에 대해 무시됩니다. 이러한 프로그램의 경우 시스템은 다음과 같은 조건에서 커미트를 수행합니다.
  • I/O PCB와 연관된 직렬 파일에 대한 get next 문의 결과가 다음 메시지의 첫 번째 세그먼트를 검색하는 get unique(GU) 호출이 될 때마다
  • dliLib.AIBTDLI(), dliLib.EGLTDLI() 또는 vgLib.VGTDLI()를 사용하여 I/O PCB에 대해 CHKP 호출 또는 get unique(GU) 호출을 실행할 때마다
I/O PCB와 연관된 직렬 파일을 읽기 위해 get next 문을 사용하지 않는 일괄처리 중심 BMP 프로그램의 경우 sysLib.commit()를 호출하면 DL/I 기본 CHKP 호출이 됩니다. 이 호출은 모든 데이터베이스에 변경사항을 커미트합니다. dliLib.psbData.psbName 구조의 컨텐츠는 CHKP 호출에서 체크포인트 ID로 사용됩니다.

GSAM 파일은 기본 CHKP와 함께 사용될 때 복구 불가능합니다. GSAM 파일을 복구 가능으로 만들려면 기호 체크포인트에 대해 sysLib.commit() 대신 dliLib.AIBTDLI(), dliLib.EGLTDLI() 또는 vgLib.VGTDLI()를 사용하십시오.

IMS/VS
sysLib.commit()는 무시됩니다. 커미트 처리는 다음 암시적 커미트 지점에서만 발생합니다.
  • 텍스트 UI 프로그램의 경우, 각 converse 문에서 또는 실행 단위에서 설명하는 것처럼 실행 단위가 성공적으로 종료될 때
  • 기본 프로그램의 경우 시스템은 다음과 같은 방식으로 커미트를 수행합니다.
    • I/O PCB와 연관된 직렬 파일에 대한 get next 문의 결과가 다음 메시지의 첫 번째 세그먼트를 검색하는 get unique(GU) 호출이 될 때마다
    • dliLib.AIBTDLI, dliLib.EGLTDLI 또는 vgLib.VGTDLI를 사용하여 I/O PCB에 대해 CHKP 호출 또는 get unique(GU) 호출을 실행할 때마다
모든 데이터베이스 및 직렬 파일의 변경사항은 암시적 커미트 지점에서 커미트됩니다.
논리적 작업 단위와 관련하여, 명시적 체크포인트 명령(CHXP)은 I/O PCB에 대해 get unique(GU) 호출을 유발하며 이는 커미트를 유발합니다. 다음 경고가 적용됩니다.
  • 텍스트 UI 프로그램에서 CHKP 명령을 실행하지 마십시오. 이 명령을 실행하면 생성된 COBOL 프로그램이 입력 메시지 큐와 상호작용하는 방식을 방해하게 됩니다.
  • 코드에서 I/O PCB 액세스를 명시적으로 처리하는 경우에도 기본 프로그램에서 CHKP 명령을 실행하지 마십시오.
iSeries COBOL
암시적 커미트는 다음과 같은 상황에서 실행됩니다.
  • 기본 텍스트 UI 프로그램이 종료되어 실행 단위가 끝난 것으로 간주되는 경우. 이 상황의 가장 일반적인 경우는 기본 텍스트 UI 프로그램이 EGL이 아닌(또는 VisualAge Generator가 아닌) 시작된 프로그램으로 돌아가는 경우입니다.
  • 프로그램이 transfer to transaction 문을 실행하는 경우.

프로그램이 SQL 요청을 실행한 경우, sysLib.commit()를 호출하면 SQL COMMIT WORK 문이 됩니다. 프로그램이 SQL 요청을 실행하지 않은 경우, sysLib.commit()는 iSeries COMMIT 명령과 동등하게 됩니다.

z/OS 일괄처리

프로그램이 PSB를 지정하지 않았지만 SQL 요청을 실행한 경우, sysLib.commit()를 호출하면 SQL COMMIT WORK 문이 됩니다.

프로그램에 지정된 PSB가 있는 경우, sysLib.commit()를 호출하면 DL/I 기본 CHKP 호출이 되며, 이는 모든 데이터베이스에 변경사항을 커미트합니다. dliLib.psbData.psbName 구조의 컨텐츠는 CHKP 호출에서 체크포인트 ID로 동작합니다.

GSAM 파일은 기본 CHKP와 함께 사용될 때 복구 불가능합니다. GSAM 파일을 복구 가능으로 만들려면 기호 체크포인트에 대해 sysLib.commit() 대신 dliLib.AIBTDLI(), dliLib.EGLTDLI() 또는 vgLib.VGTDLI()를 사용하십시오.