ASP 강의 시리즈(21) 트랜잭션 스크립트 만들기
저자:Eve Cole
업데이트 시간:2009-05-30 19:58:32
비즈니스 애플리케이션에는 트랜잭션 내에서 스크립트와 구성 요소를 실행하는 기능이 필요한 경우가 많습니다. 트랜잭션은 서버 작업입니다. 작업에 여러 단계(예: 주문, 재고 확인, 청구서 지불 등)가 포함되어 있어도 작업의 전반적인 성공 또는 실패만 반환할 수 있습니다. 사용자는 트랜잭션 내에서 실행되는 ASP 스크립트를 만들 수 있습니다. 스크립트의 일부가 실패하면 전체 트랜잭션이 종료됩니다.
ASP 트랜잭션 처리는 MTS(Microsoft Transaction Server)를 기반으로 합니다. MTS(Microsoft Transaction Server)는 확장 가능하고 강력한 고성능 기업 인터넷 및 인트라넷 서버 응용 프로그램을 개발, 구성 및 관리하기 위한 트랜잭션 처리 시스템입니다. Transaction Server는 분산된 구성 요소 기반 응용 프로그램을 개발하기 위한 응용 프로그램 디자인 모델을 제공합니다. 또한 이러한 애플리케이션을 구성하고 관리하기 위한 런타임 환경도 제공합니다.
트랜잭션 스크립트를 생성하는 기능은 Internet Information Server와 Personal Web Server에 내장되어 있습니다. Microsoft Transaction Server가 설치되어 있는 경우 트랜잭션 내에서 실행되도록 구성 요소를 패키지화할 수 있습니다.
트랜잭션 정보 트랜잭션은 작업의 전반적인 성공 또는 실패를 의미합니다. 트랜잭션 처리는 데이터베이스를 안정적으로 업데이트하는 데 사용됩니다. 데이터베이스에 관련 변경 사항을 많이 적용하거나 여러 데이터베이스를 동시에 업데이트하는 경우 모든 변경 사항이 올바르게 실행되는지 확인하세요. 이러한 변경 사항 중 하나라도 실패하면 데이터베이스 테이블의 원래 상태를 복원해야 합니다.
MTS가 없으면 일부 변경 사항이 실패한 경우 데이터를 복구하기 위해 요청된 변경 사항을 수동으로 추적하는 스크립트와 구성 요소를 작성해야 합니다. MTS를 사용하면 스크립트와 구성 요소를 "트랜잭션 필요"로 선언하고 MTS가 트랜잭션 일관성을 처리하도록 할 수 있습니다. 트랜잭션 처리는 데이터베이스 액세스에만 적용됩니다. MTS는 파일 시스템이나 기타 비트랜잭션 리소스에 대한 변경 사항을 복구할 수 없습니다. 응용 프로그램에서 액세스하는 데이터베이스는 MTS에서 지원되어야 합니다. 현재 MTS는 SQL Server와 XA 프로토콜(X/Open Association에서 지정)을 지원하는 모든 서버를 지원합니다. MTS는 다른 데이터베이스에 대한 지원을 계속 확장할 예정입니다.
트랜잭션은 여러 ASP 페이지에 걸쳐 있을 수 없습니다. 트랜잭션에 여러 구성 요소의 개체가 필요한 경우 이러한 개체를 사용하는 작업을 ASP 페이지에 결합해야 합니다. 예를 들어 급여 데이터베이스를 업데이트하는 구성 요소와 인사 데이터베이스의 직원 기록을 업데이트하는 구성 요소가 있다고 가정합니다. 직원에 대한 새로운 급여 정보를 기록하려면 트랜잭션 컨텍스트에서 이 두 구성요소를 호출하는 스크립트를 작성해야 합니다. 하나는 급여 데이터베이스를 업데이트하고 다른 하나는 인적 자원 데이터베이스에서 직원 등급을 업데이트합니다.
트랜잭션 스크립트 선언 페이지를 트랜잭션으로 선언하면 페이지의 모든 스크립트 명령과 개체가 동일한 트랜잭션 환경에서 실행됩니다. 트랜잭션 서버는 트랜잭션 생성의 세부 사항을 처리하고 트랜잭션이 성공(커밋)할지 실패(종료)할지 여부를 결정합니다. 페이지를 트랜잭션 페이지로 선언하려면 페이지 상단에 @TRANSACTION 지시문을 추가하세요.
<%@ 거래 = 값 %>
값 매개변수는 다음 중 하나일 수 있습니다.
가치 의미
Requires_New는 새 트랜잭션을 시작합니다.
필수는 새 트랜잭션을 시작합니다.
지원됨은 트랜잭션을 시작하지 않습니다.
Not_Supported 트랜잭션을 시작하지 않습니다.
@TRANSACTION 지시문은 페이지의 첫 번째 줄에 있어야 합니다. 그렇지 않으면 오류가 생성됩니다. 이 지시어는 트랜잭션 하에서 실행되어야 하는 모든 페이지에 추가되어야 합니다. 스크립트 처리가 끝나면 현재 트랜잭션이 종료됩니다.
대부분의 애플리케이션에는 특정 작업에만 트랜잭션 환경이 필요합니다. 예를 들어, 항공사 사이트에서는 발권 및 좌석 배치를 처리하기 위해 트랜잭션 스크립트만 필요할 수 있지만 다른 모든 스크립트는 트랜잭션 환경 없이 안전하게 실행될 수 있습니다. 트랜잭션은 트랜잭션 처리가 필요한 페이지에만 사용해야 하므로 애플리케이션의 Global.asa 파일을 트랜잭션용으로 선언하지 마십시오.
트랜잭션이 중단되면 트랜잭션 서버는 트랜잭션 지원 리소스에 대한 모든 변경 사항을 되돌립니다. 데이터베이스의 데이터는 엔터프라이즈 애플리케이션에 가장 중요하므로 현재 데이터베이스 서버만 트랜잭션을 완벽하게 지원합니다. 트랜잭션 서버는 하드 디스크의 파일, 세션 및 응용 프로그램 변수, 컬렉션 등에 대한 변경 사항을 복원하지 않습니다. 그러나 다음 항목에 설명된 대로 트랜잭션 이벤트를 작성하여 변수 및 컬렉션 복원을 스크립트로 작성할 수 있습니다. 파일에 데이터를 쓰는 데 실패하는 경우와 같이 특정 시점에는 스크립트가 트랜잭션을 명시적으로 커밋하거나 종료할 수도 있습니다.
스크립트 커밋 또는 종료 Transaction Server는 트랜잭션 처리를 추적하므로 트랜잭션이 완전히 성공했는지 실패했는지 확인합니다. 스크립트는 ObjectContext.SetAbort를 호출하여 트랜잭션을 명시적으로 종료할 수 있습니다. 예를 들어, 스크립트는 구성 요소로부터 오류 메시지를 받거나, 비즈니스 사양을 위반하거나(예: 계정 잔액이 0 미만인 경우), 파일 읽기 및 쓰기와 같은 비트랜잭션 작업에 실패할 경우 트랜잭션을 종료해야 합니다. 트랜잭션이 완료되기 전에 페이지 시간이 초과되면 트랜잭션도 종료되어야 합니다.
트랜잭션 이벤트 스크립트 작성만으로는 트랜잭션의 성공 여부가 결정되지 않습니다. 그러나 트랜잭션이 커밋되거나 종료될 때 호출되는 이벤트를 작성할 수 있습니다. 예를 들어 은행 계좌를 확인하는 스크립트가 있고 다양한 거래 상태에 대해 사용자에게 다양한 페이지를 반환해야 하는 경우 OnTransactionCommit 및 OnTransactionAbort 이벤트를 사용하여 사용자에게 다양한 응답을 작성할 수 있습니다.
<%@ 거래 = 필수 %>
<%
'다른 페이지가 표시될 수 있도록 출력을 버퍼링합니다.
응답.버퍼 = 참
%>
<HTML>
<본문>
<H1>온라인 뱅킹 서비스에 오신 것을 환영합니다</H1>
<%
BankAction = Server.CreateObject("MyExample.BankComponent") 설정
BankAction.Deposit(요청("AcctNum"))
%>
<P>감사합니다. 거래가 처리 중입니다.</P>
</BODY>
</HTML>
<%
' 거래가 성공하면 이 페이지를 표시합니다.
SubOnTransactionCommit()
응답."<HTML>" 쓰기
응답."<BODY>" 쓰기
응답.쓰기 "감사합니다. 귀하의 계정에 적립되었습니다."
응답.쓰기 "</BODY>"
응답."</HTML>" 쓰기
응답.플러시()
서브 끝
%>
<%
' 거래가 실패하면 이 페이지를 표시합니다.
SubOnTransactionAbort()
응답.지우기()
응답."<HTML>" 쓰기
응답."<BODY>" 쓰기
응답.쓰기 "거래를 완료할 수 없습니다."
응답.쓰기 "</BODY>"
응답."</HTML>" 쓰기
응답.플러시()
하위 종료
%>
MTS 리소스 관리자에 구성 요소 등록 트랜잭션에 참여하려면 구성 요소가 MTS 패키지에 등록되어야 하며 트랜잭션을 요구하도록 구성되어야 합니다. 예를 들어 스크립트가 두 구성 요소를 호출하여 주문을 처리하는 경우 하나는 재고 데이터베이스를 업데이트하고 다른 하나는 결제 데이터베이스를 업데이트합니다. 그런 다음 이 두 구성 요소는 동일한 트랜잭션 환경에서 실행되어야 합니다. 트랜잭션 서버는 구성 요소에 오류가 발생하면 데이터베이스가 업데이트되지 않도록 보장합니다. Ad Rotator 구성 요소와 같은 일부 구성 요소에는 트랜잭션이 필요하지 않습니다.
MTS Resource Manager를 사용하여 트랜잭션 구성 요소를 등록하고 구성합니다. 트랜잭션의 속성은 트랜잭션 필요 또는 새 트랜잭션 필요로 설정되어야 합니다. 트랜잭션 구성 요소는 MTS 패키지에 등록되어야 합니다. IIS 내부 프로세스 패키지에 구성 요소를 배치하는 대신 자신만의 패키지를 만드십시오. 일반적으로 모든 구성 요소는 구성 요소 라이브러리에 배치되어야 합니다. 구성 요소 라이브러리의 구성 요소는 여러 ASP 응용 프로그램에서 사용될 수 있으며 ASP 응용 프로그램 프로세스에서 실행될 수 있습니다. MTS Explorer를 사용하여 새 패키지를 만들고 패키지의 활성화 속성을 라이브러리로 설정합니다.
트랜잭션 구성 요소는 서버 패키지에도 등록할 수 있습니다. 서버 패키지는 일반적으로 서버에서 별도의 프로세스로 실행됩니다. 기능 그룹 기반 보안 검사를 사용하거나 원격 컴퓨터의 응용 프로그램에서 구성 요소에 액세스할 수 있도록 하려면 트랜잭션 구성 요소용 서버 패키지를 사용하세요.
MTS Explorer를 사용하려면 Microsoft Transaction Server를 설치해야 합니다.
개체 범위 일반적으로 MTS 구성 요소에서 생성된 개체를 ASP 응용 프로그램이나 세션 개체에 저장하지 마십시오. MTS 개체는 트랜잭션이 완료된 후 사라집니다. Session 개체와 Application 개체는 서로 다른 ASP 페이지 간에 사용되는 개체 인스턴스용으로 설계되었으므로 트랜잭션이 끝날 때 해제되는 개체를 저장하는 데 사용하지 마십시오.
ASP 스크립트는 선언된 트랜잭션의 루트이자 시작점입니다. 트랜잭션 ASP 페이지에서 사용되는 모든 MTS 개체는 트랜잭션의 일부로 간주됩니다. 트랜잭션이 완료되면 세션 또는 응용 프로그램 개체에 저장된 개체를 포함하여 페이지에 사용된 MTS 개체가 사라집니다. 이 시점 이후에는 다른 트랜잭션 페이지에서 세션 범위 또는 애플리케이션 범위 개체를 호출하려는 시도가 실패합니다.
트랜잭션 대기열 원격 서버에서 데이터베이스를 업데이트하면 네트워크 지연이나 오류로 인해 트랜잭션이 지연되거나 종료될 수 있습니다. 트랜잭션의 모든 부분이 커밋되어야 하기 때문에 애플리케이션이 중단되어 원격 서버로부터 커밋 또는 중단 메시지를 기다리거나 데이터베이스 업데이트를 보낼 수 없어 트랜잭션이 중단될 수 있습니다.
동시에 완료해야 하는 업데이트의 경우 올바른 접근 방식은 트랜잭션을 종료하거나 트랜잭션의 모든 참가자가 커밋할 수 있을 때까지 트랜잭션 완료를 지연하는 것입니다. 예를 들어, 항공사의 예약 프로세스에서는 고객의 은행 계좌에서 인출하는 동시에 항공사의 은행 계좌에 입금해야 합니다. 업데이트가 전체 거래의 일부이지만 다른 업데이트보다 늦을 수 있는 경우 고객이 전체 업데이트 프로세스가 완료될 때까지 기다리게 하고 싶지 않을 수 있습니다. 예를 들어, 항공편 예약 거래에서는 음식 공급업체에 음식 주문을 보내거나 고객의 여행 수당을 업데이트할 수도 있습니다. 이러한 작업은 완료해야 하지만 나중에 수행할 수도 있습니다.
Microsoft 메시지 대기열 서버를 사용하면 업데이트 또는 업데이트 집합을 원격 서버에 대한 트랜잭션 메시지로 묶을 수 있습니다. 메시지 큐 서버는 현재 네트워크를 사용할 수 없는 경우에도 업데이트가 원격 서버로 전송되도록 보장합니다. 앱은 커밋 메시지를 받고 트랜잭션 처리를 계속할 수 있습니다.