트랜잭션 및 스케줄러

스케줄러는 기본적으로 단일 글로벌 트랜잭션으로 태스크를 실행합니다. QOS_ONLYONCE 또는 QOS_ATLEASTONCE 서비스 품질을 사용하여 태스크가 단일 작업 단위로 한 번 실행되는지 아니면 독립적 트랜잭션으로 실행되는지 여부를 지정할 수 있습니다.

태스크 실행 시 트랜잭션 작동

스케줄러는 기본적으로 단일 글로벌 트랜잭션으로 태스크를 실행하므로, 태스크가 완료되거나 실패할 때까지 트랜잭션이 열려 있습니다. 해당 트랜잭션에 포함된 자원은 다양한 제한시간의 영향을 받고 태스크가 장기간 동안(몇 분 또는 몇 시간에 걸쳐) 실행될 경우 태스크의 스레드가 정지된 것으로 식별될 수 있습니다.

QOS_ONLYONCE

스케줄된 태스크는 QOS_ONLYONCE 서비스 품질을 사용할 때 한 번만 성공적으로 실행됩니다. 이 조치는 단일 작업 단위로 태스크에서 수행된 모든 작업을 그룹화하여 완료됩니다. 각 태스크가 시작할 때 단일 글로벌 트랜잭션 컨텍스트에서 다음 이벤트가 발생합니다.
  1. 태스크를 작성한 애플리케이션의 컨텍스트가 스레드에 적용됩니다.
  2. 글로벌 트랜잭션 컨텍스트가 시작됩니다.
  3. 다음 시작 시간 및 시작 제한 시간이 UserCalendar Bean 또는 DefaultUserCalendar를 사용하여 계산됩니다.
    중요사항: TaskInfo.setTaskExcecutionOptions 메소드를 TaskInfo.EXECUTION_DELAYEDUPDATE 옵션과 함께 사용하면, 이 단계는 레코드 업데이트 후에 수행됩니다.
  4. 태스크가 기록되는 태스크 데이터베이스는 다음 태스크의 상태로 데이터베이스에서 업데이트되고, 태스크가 완료되고 태스크의 자동 제거 설정이 true인 경우 삭제됩니다.
  5. 태스크 데이터베이스 레코드는 다음 태스크의 상태로 데이터베이스에서 업데이트되고, 태스크가 완료되고 태스크의 자동 제거 설정이 true인 경우에 삭제됩니다. EXECUTION_DELAYEDUPDATE 옵션을 사용할 경우, 데이터베이스는 태스크의 다음 상태를 반영하지 않지만 TaskStatus.RUNNING 상태로 현재 상태가 설정됩니다.
  6. NotificationSink Bean이 설정되면, FIRING 알림이 시작됩니다.
  7. BeanTaskInfo 또는 MessageTaskInfo 오브젝트가 시작됩니다.
  8. 태스크에 실패하고 NotificationSink Bean이 설정되어 있는 경우 별도의 트랜잭션에서 FIRE_FAILED 알림이 나타납니다.
  9. 태스크의 NotificationSink Bean이 설정되어 있으면 필요에 따라 다양한 알림이 나타납니다.
  10. 태스크에 EXECUTION_DELAYEDUPDATE 옵션을 사용할 경우, 데이터베이스는 두 번째로 태스크의 다음 상태로 업데이트됩니다.
  11. 글로벌 트랜잭션이 커미트됩니다.
태스크에 속하는 모든 이벤트는 단일 글로벌 트랜잭션 컨텍스트에서 실행되므로, 트랜잭션 관련 오류를 피하기 위해서는 다음과 같은 점을 고려하십시오.
  • 태스크 트랜잭션에 참여하는 각 자원에서는 2단계 XA 기능이 있어야 합니다.

    여기에는 스케줄러에 대해 구성된 JDBC(Java™ Database Connectivity) 데이터 소스, MessageTaskInfo 오브젝트에서 사용하는 JMS(Java Messaging Service), 트랜잭션 설정이 "필요"인 UserCalendar, TaskHandler 또는 NotificationSink Bean에서 사용되는 자원이 포함됩니다.

  • 트랜잭션을 작성한 애플리케이션에 대해 마지막 참가자 지원이 사용 가능한 경우, 한 자원은 단일 단계일 수 있습니다. 어셈블리 도구를 사용하여 마지막 참가자 지원을 사용합니다. 관리 콘솔을 통해 마지막 참가자를 지원할 수도 있습니다. 세부사항은 마지막 참가자 지원 확장 설정 주제를 참조하십시오.

예상치 못한 모든 예외는 활동 로그에 기록되며, 태스크 글로벌 트랜잭션에 참가하는 모든 이벤트가 롤백됩니다. 이 경우 태스크 데이터베이스 레코드에 대한 변경사항이 포함됩니다. 이 변경사항은 다음 폴 주기 중에 스케줄러 디먼이 데이터베이스를 폴링할 때 다시 태스크를 강제로 실행합니다. UserCalendar, TaskHandler, NotificationSink Bean은 Bean의 트랜잭션 설정을 "신규 필요"로 설정하여 글로벌 트랜잭션에 참가하지 않도록 선택할 수 있습니다.

QOS_ATLEASTONCE

QOS_ATLEASTONCE 서비스 품질(QoS)을 사용하는 스케줄된 태스크는 단일 트랜잭션 컨텍스트를 포함하지 않습니다. 이 경우, 달력을 계산할 때마다 이벤트 알림 및 데이터베이스 업데이트가 독립된 트랜잭션으로 수행됩니다.
  1. 태스크를 작성한 애플리케이션의 컨텍스트가 스레드에 적용됩니다.
  2. 태스크의 데이터베이스 레코드가 태스크의 RUNNING 상태로 업데이트됩니다.
  3. UserCalendar, NotificationSink Bean이 호출됩니다.
  4. BeanTaskInfo 또는 MessageTaskInfo가 시작됩니다.
  5. 결과 알림이 전송됩니다.
  6. RUNNING 상태가 기록된 후 태스크가 변경되지 않은 경우 데이터베이스는 태스크의 다음 상태로 업데이트됩니다.

RUNNING 상태가 기록되고 나서 결과가 기록되기 전에 실패가 발생하면, 태스크가 여러 번 실행될 수 있습니다.

QOS_ATLEASTONCE를 사용할 때, 모든 NotificationSink, UserCalendar, TaskHandler Bean은 트랜잭션(TX_MANDATORY)을 요구할 수 없습니다. 태스크가 실행될 때 사용할 수 있는 글로벌 트랜잭션이 없기 때문입니다. EJB 컴포넌트는 "필수" 또는 "신규 필요" 컨테이너 관리 트랜잭션이나 Bean 관리 트랜잭션을 사용합니다.

scheduler API 메소드 또는 WASScheduler MBean 조작을 사용할 경우의 트랜잭션 동작

모든 스케줄러 인터페이스 메소드는 단일 글로벌 트랜잭션 컨텍스트에 참가합니다. create(), suspend(), resume(), cancel(), purge() 메소드를 실행할 때 글로벌 트랜잭션 컨텍스트가 이미 스레드에 있는 경우 기존 글로벌 트랜잭션이 사용됩니다. 그렇지 않으면 새 글로벌 트랜잭션이 시작합니다.

메소드가 호출자의 글로벌 트랜잭션에 참여하고 예상하지 못한 오류가 나타나는 경우 트랜잭션은 롤백되도록 표시됩니다. 예외가 선언된 예외이면 호출자에게 예외가 다시 제출되고 호출자가 커미트 또는 롤백하도록 트랜잭션 단독으로 남습니다.

메소드가 자체의 글로벌 트랜잭션을 시작하고 예외가 발생하는 경우 트랜잭션은 롤백되고 예외는 호출자로 다시 제출됩니다.


주제 유형을 표시하는 아이콘 개념 주제



시간소인 아이콘 마지막 업데이트 날짜: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csch_tasktransaction
파일 이름:csch_tasktransaction.html