CICS 환경을 위한 PSB 스케줄링

CICS® 환경에서 PSB 스케줄링은 비CICS 환경에서와 다르게 처리됩니다.

다음 절에서는 PSB 스케줄링, 런타임에 대체 PSB를 사용하는 방법 및 PSB를 호출된 프로그램과 공유하는 방법에 대해 설명합니다.

PSB 스케줄링

PSB에 정의된 데이터베이스에 CICS DL/I 프로그램이 액세스하려면 우선 프로그램이 PSB를 스케줄해야 합니다. 프로그램은 데이터베이스 액세스가 완료되면 PSB를 종료해야 합니다. Rational® COBOL Runtime은 프로그램을 위해 PSB 스케줄링을 자동으로 처리합니다. 그러나 PSB 스케줄링은 다음 기능에 영향을 미치므로 PSB가 스케줄된 시기를 알고 있어야 합니다.
세그먼트 레코드 잠금
PSB가 종료될 때 세그먼트 업데이트 잠금이 해제됩니다.
데이터베이스 위치 지정
PSB가 종료될 때 데이터베이스 위치가 유실됩니다.
업데이트 커미트
PSB가 종료될 때 변경사항이 커미트(데이터베이스에 쓰여짐)됩니다.

PSB는 DL/I 호출이 프로그램에 대해 실행될 때마다 스케줄되며, 현재는 PSB가 스케줄되어 있지 않습니다. dliLib.psbData.psbName이라는 이름의 PSB가 스케줄된 PSB입니다.

call 또는 transfer to program 문을 사용하여 프로그램 제어를 전송하는 경우, 대상 프로그램은 전송 프로그램이 사용하는 것과 동일한 PSB를 사용할 필요가 없습니다.

PSB는 CICS SYNCPOINT 또는 SYNCPOINT ROLLBACK이 실행될 때마다 종료됩니다. SYNCPOINT는 다음 중 하나가 발생할 때 발생합니다.
  • 실행 단위의 최상위 레벨 프로그램이 종료되고 CICS에 제어를 리턴합니다. CICS의 경우 실행 단위는 단일 트랜잭션과 동등하며, transfer to program 또는 call 문을 사용하여 서로 간에 제어를 전송하는 모든 EGL 프로그램 및 비EGL 프로그램으로 구성됩니다. 비EGL 프로그램의 경우 실행 단위에는 CALL 명령문, CICS LINK 명령 또는 CICS XCTL 명령을 사용하는 모든 전송도 포함됩니다.
  • 프로그램이 converse 문을 사용하고 다음 중 하나가 1로 설정됩니다.
    • converseVar.segmentedMode(프로그램 특성이 YES로 설정된 경우 기본값은 1입니다.)
    • converseVar.commitOnConverse
  • transfer to transaction 문을 사용하는 전송이 발생합니다.
  • 프로그램이 sysLib.commit 함수를 호출합니다.
  • PSB가 현재 스케줄된 경우, EGL 프로그램은 transfer to program 문을 사용하여 전송하며 다음 중 하나가 발생합니다.
    • 비EGL 및 비VisualAge Generator 프로그램으로 전송됩니다.
    • synchOnPgmTransfer 빌드 디스크립터 옵션은 전송 프로그램에 대해 YES으로 설정됩니다.
    • synchOnPgmTransfer 빌드 디스크립터는 전송 프로그램에 대해 NO로 설정되며 전송 프로그램의 PSB 레코드에서 참조되는 기본 PSB는 대상 프로그램의 PSB 레코드에서 참조되는 기본 PSB와 다릅니다. 전송 프로그램이 CICS와 IMS/VS 둘 다에 대해 생성될 때 동작의 차이를 최소화하려면 synchOnPgmTransfer 빌드 디스크립터 옵션을 NO로 설정하십시오.
  • EGL 호출 DL/I 프로그램은 호출하는 비EGL 프로그램으로 돌아가고 PSB는 dliLib.psbData 구조로 전달되지 않았으며 PCB는 PCB 레코드를 사용하여 전달되지 않았습니다.
SYNCPOINT ROLLBACK은 다음 경우에 발생합니다.
  • EGL 프로그램이 sysLib.rollback 함수를 호출합니다.
  • 프로그램이 오류 조건으로 인해 종료됩니다.
롤백이 발생하면 논리적 작업 단위가 시작된 후 데이터베이스 및 복구 가능 파일에 대해 작성된 모든 변경사항이 원래 상태로 돌아갑니다.

런타임 시 대체 PSB

DL/I 프로그램을 작성하는 경우, psb 특성을 사용하여 PSBRecord 파트를 기반으로 하는 프로그램 변수의 이름을 지정하십시오. EGL은 이 변수와 연관된 PSBRecord를 사용하여 PSB에 정의된 세그먼트에 대한 DL/I 호출을 작성하고 DL/I 호출에 대해 작성하는 변경사항을 유효성 검증합니다. CICS 환경에서 Rational COBOL Runtime은 또한 프로그램이 실행될 때 PSB 스케줄링을 위해 PSB 이름을 사용합니다.

그러나 동일한 프로그램에서 대체 PSB를 사용하려 할 수도 있습니다. 데이터베이스 자체는 다를 수 있지만, 대체 PSB는 프로그램 PSB와 동일한 구조의 데이터베이스를 설명합니다. 예를 들어, 프로그램 개발용 테스트 데이터베이스 세트와 프로덕션용 실제 데이터가 포함된 프로덕션 데이터베이스 세트가 있을 수 있습니다.

대체 PSB를 사용하려는 경우, 프로그램은 첫 번째 DL/I 함수를 실행하기 전에 대체 PSB 이름을 dliVar.dliPsbName으로 이동하여 스케줄된 PSB를 동적으로 변경할 수 있습니다. 대체 PSB는 데이터베이스 이름을 제외하면 프로그램 PSB와 일치해야 합니다.

스케줄된 PSB를 호출된 프로그램과 공유

동일한 프로그램 PSB를 공유하는 경우 또는 커미트가 각 호출보다 먼저 PSB를 종료하거나 다른 PSB를 사용하는 프로그램으로 돌아가는 경우 외에는 호출된 프로그램과 호출하는 프로그램이 둘 다 DL/I 프로그램이 될 수는 없습니다. 프로그램이 callInterface 특성을 CBLTDLI로 설정하는 경우, 호출된 프로그램과 호출하는 프로그램 둘 다에 대한 호출에서 dliLib.psbData 구조 또는 PCB 레코드를 전달하여 PSB를 다른 프로그램과 공유할 수 있습니다. 프로그램이 callInterface 특성을 AIBTDLI(기본값)로 설정하는 경우, 호출하는 프로그램 또는 호출된 프로그램이 비EGL 프로그램이면 dliLib.psbData 구조 또는 PCB 레코드를 전달하십시오.

호출된 프로그램과 호출하는 프로그램이 둘 다 EGL 프로그램이고 PSB가 호출 전에 스케줄된 경우, EGL은 호출된 프로그램에서 PSB를 다시 스케줄하지 않습니다.

EGL 프로그램과 비EGL 프로그램 사이에 PSB를 공유할 수 있습니다. dliLib.psbData 구조가 매개변수로 전달되는 경우, 12바이트 영역이 전달됩니다. 앞부분의 8바이트에는 PSB 이름이 포함되고 뒷부분의 4바이트에는 CICS UIB(User Interface Block)의 주소가 포함됩니다. PSB가 스케줄되지 않은 경우 UIB 주소는 0입니다.

EGL 프로그램과 비EGL 프로그램 사이에 PSB를 공유하는 경우, 호출된 프로그램은 스케줄하기 전에 UIB 주소를 확인해야 합니다. UIB 주소가 0이 아니면 PSB를 다시 스케줄하면 안 됩니다. 호출된 프로그램이 PSB를 종료하는 경우, 이 프로그램은 UIB 주소 필드를 0으로 설정해야 합니다. PSB가 다시 스케줄되는 경우 UIB 주소 필드는 CICS가 리턴하는 UIB 주소로 설정되어야 합니다.

프로그램이 스케줄된 PSB를 호출 대상 EGL 프로그램과 공유해야 하는 경우 이 프로그램은 12바이트 영역을 해당 프로그램에 전달합니다. 첫 8바이트는 PSB 이름을 포함해야 하고 다음 4바이트는 UIB 주소를 포함해야 합니다. PSB가 스케줄되지 않은 경우 UIB 주소는 0이어야 합니다. 리턴 시 UIB 주소는 PSB의 현재 스케줄링 상태를 반영합니다.

레코드 큐잉에서 교착 상태 후 복구

업데이트된 레코드는 PSB가 종료될 때까지 데이터베이스에 쓰여지지 않습니다. EGL get...forUpdate I/O 문은 데이터베이스에 쓸 때까지 다른 프로그램이 레코드를 변경할 수 없도록 잠그므로 프로그램은 PSB가 종료될 때까지 이러한 레코드에 대한 독점 사용권을 얻습니다. 따라서 다음과 같은 교착 상태 상황이 발생할 수 있습니다.
  • 사용자의 프로그램(Program1)이 RecordA를 잠급니다.
  • 다른 프로그램(Program2)이 RecordB를 잠급니다.
  • 사용자가 RecordB를 변경하려고 시도합니다.
  • Program2가 동시에 RecordA를 변경하려고 시도합니다.

CICS가 교착 상태 상황을 발견하면 프로그램 중 하나가 비정상적으로 종료되며 데이터베이스에서 변경된 사항을 되돌리고 프로그램이 종료된 이유를 설명하는 메시지를 터미널에 씁니다.

프로그램 사용자가 프로그램의 비정상적인 종료를 승인하지 않는 경우, 사용자의 프로그램을 CICS 테이블에서 restartable로 정의할 수 있습니다. 프로그램 다시 시작에 대한 정보는 이 주제의 "DL/I 교착 상태 후 EGL 프로그램 다시 시작"을 참조하십시오.

프로그램이 다시 시작 가능하고 CICS가 교착 상태 상황을 발견한 경우, CICS는 PSB가 스케줄된 후 프로그램이 변경한 사항을 되돌리고 트랜잭션의 처음부터 프로그램을 다시 시작합니다.

프로그램이 세그먼트(CICS 의사 대화식) 모드에서 실행 중이면 프로그램의 최신 세그먼트가 다시 시작되므로 프로그램에 특별한 다시 시작 코드가 필요하지 않습니다.

세그먼트되지 않은(CICS 대화식) 프로그램이 다시 시작되면 프로그램은 맨 위에서 다시 시작됩니다. dliVar.cicsRestart 필드의 값 1에 대한 프로그램 테스트에서 프로그램이 다시 시작되었음을 판별할 수 있습니다. dliVar.cicsRestart가 1이면 프로그램 사용자에게 교착 상태 때문에 프로그램이 다시 시작되었음을 알리는 메시지를 쓰고 초기 프로그램 맵을 다시 표시할 수 있습니다.

DL/I 교착 상태 후 EGL 생성 프로그램 다시 시작

DL/I 프로그램 격리 기능이 사용되는 경우, 동일한 레코드를 잠그는 두 트랜잭션 사이에 교착 상태가 발생할 수 있습니다. 두 프로그램이 동시에 동일한 레코드를 업데이트하려고 시도합니다. 두 업데이트가 모두 허용되면 변경사항 중 하나가 손실됩니다. CICS는 데이터가 손실되었음을 발견하면 ADLD 이상 종료 코드와 함께 트랜잭션을 비정상적으로 종료합니다.

Rational COBOL 런타임 이상 종료 핸들러 요청은 교착 상태 이상 종료로 끝나는 프로그램을 위해 다시 시작합니다. CICS는 다음 상황에서 트랜잭션을 처음부터 다시 시작합니다.
  • 트랜잭션 프로그램의 PCT에 DTB=YES 및 RESTART=YES를 지정했습니다.
  • CICS 트랜잭션 다시 시작 프로그램(DFHRTY)이 트랜잭션을 다시 시작하도록 지정합니다.
  • 임시 스토리지 큐가 복구 가능으로 정의되었습니다.

그렇지 않으면 CICS는 프로그램 종료 이유를 나타내는 메시지를 씁니다. 다시 시작된 프로그램은 실행 중이던 마지막 트랜잭션의 처음부터 다시 시작된 프로그램입니다. 프로그램 PSB가 마지막으로 스케줄된 후의 모든 데이터베이스 변경사항이 롤백됩니다.

CICS 다시 시작 프로그램(DFHRTY)의 분배 버전은 실행 중이던 마지막 데이터베이스 트랜잭션의 시작부터 EGL 생성 프로그램을 다시 시작하지 않습니다. DFHRTY에 코드를 추가하여 EGL 데이터베이스 트랜잭션을 다시 시작할 수 있습니다. 프로그램은 다음 조건을 충족하는지 확인해야 합니다.
  • 현재 이상 종료 코드가 ADLD입니다.
  • 트랜잭션 ID가 다시 시작할 트랜잭션의 ID입니다.
  • 다시 시작 계수가 지정된 수보다 작습니다. 이는 다시 시작 루프 검사입니다.
모든 검사가 충족되면 프로그램은 다시 시작 플래그를 on으로 설정하여 다시 시작이 계속됨을 CICS에 표시해야 합니다. DFHRTY 수정에 대한 자세한 정보는 CICS 시스템에 대한 복구, 다시 시작 및 사용자 정의 매뉴얼을 참조하십시오.

다시 시작이 요청되는 경우, 세그먼트 모드(CICS 의사 대화식)로 실행 중인 프로그램에는 복구 가능으로 정의된 업데이트할 모든 CICS 자원이 있어야 합니다. Rational COBOL Runtime의 세그먼트화 기능으로 작성된 임시 스토리지 큐의 이름은 4문자 접두부에 사용자의 터미널 ID를 추가한 것으로 구성됩니다. 사용된 접두부는 X'EE' 다음에 WRK 또는 MSG가 있는 형식입니다.

다시 시작을 처리하도록 프로그램을 설계하지 않은 경우에는 세그먼트되지 않은(CICS 대화식) 프로그램에 대해 다시 시작을 요청하지 않아야 합니다. 간단한 한 가지 방법은 프로그램이 시작될 때마다 dliVar.cicsRestart 테스트를 수행하는 것입니다. 다시 시작 플래그가 on인 경우, 다음과 같은 정보가 있는 특수한 메시지 또는 양식이 User 1에게 표시되어야 합니다.
  • User 2가 동시에 데이터베이스를 변경 중이므로 트랜잭션이 다시 시작되었습니다.
  • User 1이 변경한 사항이 원래 상태로 돌아갑니다.
  • 변경사항이 손실되지 않도록 프로그램이 다시 시작되었습니다.

분배된 DL/I 데이터베이스에 액세스

CICS에서 실행되는 프로그램은 데이터베이스가 있는 시스템에서 실행되는 기본 프로그램을 호출하여 원격 시스템에서 DL/I 데이터베이스에 액세스할 수 있습니다.