트랜잭션 이해

업무용 응용 프로그램은 트랜잭션 안에서 스크립트와 구성 요소를 실행할 수 있는 기능을 필요로 하는 경우가 종종 있습니다. 트랜잭션은 작업이 많은 단계를 포함하고 있더라도(예: 주문, 재고 확인 및 계산서 발행) 전체적으로 성공하거나 실패하는 서버 작업입니다. 스크립트의 일부가 실패하면 전체 트랜잭션을 중단하도록 트랜잭션 안에서 실행하는 서버쪽 스크립트를 만들 수 있습니다.

ASP 트랜잭션 프로세스는 뛰어난 성능의 강력하고 기준화할 수 있는 엔터프라이즈, 인터넷 및 인트라넷 서버 응용 프로그램을 개발, 전개, 관리하기 위한 트랜잭션 처리 시스템인 구성 요소 서비스 트랜잭션 환경에 기반을 두고 있습니다. 트랜잭션 환경은 구성 요소 기반의 분산 응용 프로그램을 개발하는 응용 프로그램 프로그래밍 모델을 정의합니다. 또한 이들 응용 프로그램을 전개하고 관리하는 런타임 환경을 제공합니다.

트랜잭션 스크립트를 만드는 데 필요한 기능은 웹 서버에 설치되어 있습니다. 구성 요소 서비스를 설치하면 구성 요소가 트랜잭션 안에서 실행되도록 패키지로 만들 수 있습니다.

트랜잭션 정보

트랜잭션이란 전체적으로 성공하거나 실패하는 작업입니다. 트랜잭션 프로세스는 신뢰성 있는 데이터베이스를 업데이트하는 데 사용합니다. 데이터베이스에 관련하여 많은 사항을 변경하거나 여러 데이터베이스를 동시에 업데이트할 때 모든 변경 사항이 제대로 실행되고 있는지 확인합니다. 변경 사항이 하나라도 실패하면 데이터베이스 테이블을 원래 상태로 복원하길 원할 것입니다.

구성 요소 서비스를 사용하지 않으면, 요청한 변경 사항을 직접 추적하고 변경 사항이 실패할 경우, 데이터 복원을 위해 스크립트와 구성 요소를 작성해야 합니다. 구성 요소 서비스를 사용하면 트랜잭션을 요청하고 구성 요소 서비스가 트랜잭션 조정을 처리하도록 스크립트와 구성 요소를 선언하기만 하면 됩니다. 트랜잭션 프로세스는 데이터베이스 액세스에만 적용됩니다. 구성 요소 서비스는 파일 시스템의 변경 사항이나 다른 비 트랜잭션 리소스의 변경 사항을 롤백할 수 없습니다. 응용 프로그램이 액세스하는 데이터베이스는 구성 요소 서비스에서 지원해야 합니다. 현재 구성 요소 서비스에서는 SQL Server 및 X/Open 컨소시엄에서 XA 프로토콜을 지원하는 데이터베이스를 지원합니다. 구성 요소 서비스는 다른 데이터베이스에 대한 지원을 계속할 것입니다.

Server.Transfer 및 Server.Execute 메서드의 사용은 트랜잭션이 여러 ASP 페이지를 나타낼 수 있도록 합니다. 스크립트에 Required로 지정된 값을 가진 @TRANSACTION 지시어가 포함되어 있으면 이 스크립트를 Server.Transfer 또는 Server.Execute 메서드에 의해 호출되고, 호출하는 asp 파일이 트랜잭션되었으면 이 스크립트는 호출하는 asp 파일을 계속 트랜잭션합니다. 호출한 .asp 파일을 트랜잭션하지 못하면 호출한 .asp 파일은 자동적으로 트랜잭션을 새로 만듭니다.

예를 들어, 다음 스크립트는 트랜잭션을 초기화합니다.

<%@ TRANSACTION=Required %>

<%
  .
  .
  .
'트랜잭션을 끝냅니다. 
Server.Transfer("/BookSales/EndTrans.asp")
%>

그러나, 다음 스크립트 또한 트랜잭션을 초기화하는 다른 스크립트를 호출합니다.

<%@ TRANSACTION=Required%>

<%
'사용자 정의 구성 요소를 인스턴스로 만들어 트랜잭션을 닫습니다. 
Set cnn = Server.CreateObject("ADODB.Connection")
  .
  .
  .
%>

그러나, 두 스크립트 간의 상호 작용은 단일 트랜잭션만 구성합니다. Server.Transfer와 Server.Execute로 스크립트 쓰기에 대한 자세한 내용은 브라우저로 컨텐트 보내기를 참조하십시오.

트랜잭션 스크립트 선언

트랜잭션 페이지를 선언할 때 그 페이지에 사용한 스크립트 명령과 개체는 같은 트랜잭션 상황에서 실행됩니다. 구성 요소 서비스는 트랜잭션을 만들고 트랜잭션이 성공(적용)하거나 실패(취소)하는지 여부를 판별하는 세부 사항을 처리합니다. 트랜잭션 페이지를 선언하려면 페이지의 상단에 @TRANSACTION 지시어를 추가합니다.

<%@ TRANSACTION = value %>

value 인수에 대한 자세한 내용은 @TRANSACTION 지시어 참조를 참조하십시오.

@TRANSACTION 지시어는 페이지의 맨 첫 줄에 있어야 합니다. 그렇지 않으면 오류가 발생합니다. 트랜잭션 하에서 실행해야 하는 각 페이지에 이 지시어를 추가해야 합니다. 스크립트가 처리 작업을 완료하면 현재 트랜잭션이 끝납니다.

대부분의 응용 프로그램은 특정 작업을 위한 트랜잭션 상황만을 필요로 합니다. 예를 들어, 항공사 사이트에서는 티켓 구입과 좌석 지정을 위한 트랜잭션 스크립트를 사용할 것입니다. 다른 모든 스크립트는 트랜잭션 상황 없이 안전하게 실행할 수 있습니다. 트랜잭션은 트랜잭션 프로세스가 필요한 페이지에만 사용되어야 하므로 응용 프로그램의 Global.asa 파일을 트랜잭션으로 선언할 수 없습니다.

트랜잭션이 중단되면 구성 요소 서비스에서는 트랜잭션을 지원하는 리소스의 변경 사항을 롤백합니다. 이 데이터가 엔터프라이즈 응용 프로그램에 있어서 가장 중요하므로 현재 데이터베이스 서버만이 트랜잭션을 완전히 지원합니다. 구성 요소 서비스에서는 하드 디스크의 파일, ASP 세션 및 응용 프로그램 변수나 컬렉션의 변경 사항을 롤백하지 않습니다. 그러나 이 항목 뒷 부분에서 설명하듯이 트랜잭션 이벤트를 만들어 변수와 컬렉션을 복원하는 스크립트를 작성할 수 있습니다. 또한 스크립트는 데이터 작성과 같은 작업이 실패하는 경우 트랜잭션을 명시적으로 적용하거나 중단할 수 있습니다.

스크립트 커밋 또는 중단

구성 요소 서비스는 트랜잭션 프로세스를 추적하므로 트랜잭션이 성공적으로 완료되었는지 실패했는지 여부를 판별합니다. 스크립트는 ObjectContext.SetAbort를 호출하여, 트랜잭션을 중단하는 중임을 명시적으로 선언할 수 있습니다. 예를 들어, 구성 요소에서 오류를 검색하거나, 업무 규칙 위반이 발생하거나(예: 잔고가  0 이하인 경우), 트랜잭션이 아닌 작업(파일에 읽기 또는 쓰기와 같은 작업)이 실패한 경우 스크립트는 트랜잭션을 중단할 수 있습니다. 또한 트랜잭션이 완료하기 전에 그 페이지의 대기 시간이 초과되면 트랜잭션이 중단됩니다.

트랜잭션 이벤트 작성

스크립트 자체에서는 트랜잭션이 성공했는지 실패했는지 여부를 판별할 수 없습니다. 그러나 트랜잭션이 적용되거나 중단될 때 호출하는 이벤트를 쓸 수 있습니다. 예를 들어, 은행 계좌의 대변에 금액을 기입하는 스크립트가 있어서 트랜잭션의 상태에 따라 다른 페이지를 사용자에게 반환하려 합니다. OnTransactionCommit 및 OnTransactionAbort 이벤트를 사용하여 사용자에 대한 다른 응답을 쓸 수 있습니다.

<%@ TRANSACTION=Required %>

<%
'버퍼가 다른 페이지를 표시할 수 있도록 출력합니다. 
Response.Buffer = True
%>

<HTML>
<BODY>
<H1>온라인 은행 서비스입니다. </H1>


  <%
Set cnn = Server.CreateObject("ADODB.Connection")
BankAction.Deposit(Request("AcctNum"))
  %>

<P>감사합니다. 트랜잭션을 처리하였습니다. </P>
</BODY>
</HTML>

<%
'트랜잭션이 성공적이면 이 페이지를 표시합니다. 
Sub OnTransactionCommit()
%>
<HTML>
<BODY>

감사합니다.  계좌의 대변에 금액이 기입되었습니다. 

</BODY>
</HTML>

<%
Response.Flush
End Sub
%>

<%
'트랜잭션이 실패하면 이 페이지를 표시합니다. .
Sub OnTransactionAbort()
Response.Clear
%>
<HTML>
<BODY>

트랜잭션을 완료할 수 없습니다. 

</BODY>
</HTML>
<%
Response.Flush
End Sub
%>

구성 요소 서비스 관리자에 구성 요소 등록

트랜잭션에 참여하려면 구성 요소가 COM+ 응용 프로그램에 등록되어 트랜잭션을 요청하도록 구성되어야 합니다. 예를 들어, 스크립트가 재고 데이터베이스를 업데이트하는 구성 요소와 지불 데이터베이스를 업데이트하는 구성 요소를 요청하여 주문을 처리하는 경우 두 구성 요소가 모두 하나의 트랜잭션 상황에서 실행하도록 합니다. 구성 요소 서비스는 한 구성 요소가 실패하면 전체 주문이 롤백되고 두 데이터베이스가 모두 업데이트되지 않도록 합니다. 예를 들어, Ad Rotator 구성 요소에는 더 이상 트랜잭션이 필요하지 않습니다.

구성 요소 서비스 관리자를 사용하여 트랜잭션 구성 요소를 등록하고 구성할 수 있습니다. 구성 요소는 COM+ 응용 프로그램에 등록되어야 합니다. 구성 요소를 IIS 종속 프로세스 COM+ 응용 프로그램에 두지 말고 사용자 자신의 COM+ 응용 프로그램을 만들어야 합니다. 일반적으로 모든 구성 요소를 하나의 라이브러리 응용 프로그램에 두어야 합니다. 라이브러리 응용 프로그램에 있는 구성 요소는 여러 ASP 응용 프로그램에 의해 사용될 수 있고 ASP 응용 프로그램 프로세스에서 실행할 수 있습니다.

또한 트랜잭션 구성 요소를 항상 서버에 있는 분리된 프로세스에서 실행하는 COM+ 응용 프로그램인 Server 응용 프로그램에 등록할 수 있습니다. 역할을 기반으로 하는 보안을 사용하거나 구성 요소를 원격 컴퓨터의 응용 프로그램에서 액세스할 수 있게 하려면 트랜잭션 구성 요소의 Server 응용 프로그램을 사용합니다.

구성 요소 서비스 관리자를 사용하려면 구성 요소 서비스가 설치되어 있어야 합니다.

개체 범위

일반적으로 COM 구성 요소에서 만들어진 개체를 ASP Application 또는 Session 개체에 저장할 필요가 없습니다. COM 개체는 트랜잭션이 완료되면 비활성화됩니다. Session 및 Application 개체는 여러 ASP 페이지에 대해 사용할 수 있는 개체 인스턴스를 위해 만들어졌으므로 이들을 사용하여 트랜잭션의 마지막에 릴리스할 개체를 보유할 필요가 없습니다.

ASP 스크립트는 선언된 트랜잭션의 루트 또는 시작입니다. 트랜잭션 ASP 페이지에서 사용되는 COM 개체는 트랜잭션의 일부로 간주됩니다. 트랜잭션이 완료되면 그 페이지에서 사용되는 COM 개체는 Session 또는 Application 개체에 저장된 개체를 포함하여 비활성화됩니다. 다른 트랜잭션 페이지에서 세션 범위 또는 응용 프로그램 범위 개체를 호출하는 이어지는 시도는 실패합니다.

대기 중인 트랜잭션

원격 서버의 데이터베이스 업데이트는 네트워크 지연이나 실패로 인하여 트랜잭션의 완료를 지연하거나 중단할 수 있습니다. 트랜잭션의 모든 부분이 적용되어야 하므로 응용 프로그램은 원격 서버로부터 적용 또는 중단 메시지를 기다리도록 지연시키거나 데이터베이스 업데이트를 보낼 수 없으므로 트랜잭션을 중단할 수 있습니다.

동시에 완료되어야 하는 업데이트의 경우 트랜잭션의 참가자가 모두 적용할 수 있을 때까지 트랜잭션의 완료를 중단하거나 지연하는 것이 적절합니다. 예를 들어, 항공사 티켓 주문 응용 프로그램은 고객 은행 계좌의 차변과 항공사 은행 계좌의 대변을 동시에 처리합니다. 업데이트가 트랜잭션에 있어서 중요한 부분이지만 다른 업데이트 내용보나 늦게 발생할 수 있는 경우 고객이 업데이트 완료를 기다리지 않게 할 수 있습니다. 예를 들어, 항공사 티켓을 주문하는 트랜잭션은 특별한 식사 요청을 음식 서비스 공급 업체에 보내거나 고객 마일리지를 업데이트할 수도 있습니다. 이러한 작업은 완료되어야 하지만 나중에 완료해도 되는 작업입니다.

메시지 대기열은 업데이트 또는 업데이트 집합을 원격 서버에 전달되는 하나의 트랜잭션 메시지로 묶을 수 있게 합니다. 메시지 대기열은 현재 네트워트를 사용할 수 없어도 업데이트 내용이 원격 서버에 전달되도록 보장합니다. 응용 프로그램은 적용 메시지를 받아서 트랜잭션을 계속할 수 있습니다.


© 1997-2001 Microsoft Corporation.All rights reserved.

(The following words are used by Search; they are not intended to be displayed on the page.)MSMQ