2단계: 구성 요소 간에 트랜잭션 확장
목표
이 단계에서는 다음에 대해 알아봅니다.
- 트랜잭션 흐름
- 트랜잭션에서 여러 개체가 투표하는 방법
설명
1단계: 트랜잭션 구성 요소 만들기는 Microsoft SQL Server Pubs 데이터베이스에서 작성자 정보를 업데이트하는 간단한 트랜잭션 구성 요소를 작성하는 방법을 보여 줍니다. 2단계는 트랜잭션이 여러 구성 요소에 걸쳐 확장되면 어떻게 되는지 보여 줍니다.
COM+ 프로그래밍 모델에 UpdateAuthorAddress
따라 작업을 완료하는 과정에서 다른 구성 요소를 호출합니다. 두 번째 구성 요소인 ValidateAuthorAddress
작성자의 주소에 대한 유효성을 검사하고 결과를 호출자에게 반환합니다 UpdateAuthorAddress
.
호출자와 ValidateAuthorAddress
달리 트랜잭션은 필요하지 않지만 여전히 호출자의 트랜잭션에 참여할 수 있습니다. 이 단계에서는 기존 트랜잭션을 새 개체로 확장하는 다음 그림과 같이 해당 트랜잭션 특성 값이 Supported로 설정됩니다.
지원되는 특성 값은 호출자가 트랜잭션인 경우에만 기존 트랜잭션을 확장(또는 흐름)합니다. 호출ValidateAuthorAddress
할 때 UpdateAuthorAddress
COM+는 먼저 호출자의 컨텍스트를 확인하여 트랜잭션인지 확인합니다. 그런 다음 COM+는 설정된 서비스 특성을 살펴보고 호출자 개체에 ValidateAuthorAddress
할당된 것과 동일한 트랜잭션 식별자를 새 개체에 할당합니다. 이 프로세스를 더 잘 이해하려면 컨텍스트 활성화를 참조 하세요.
동일한 트랜잭션 식별자를 공유하기 때문에 두 개체 모두 작업을 성공적으로 완료해야 합니다. 그렇지 않으면 COM+에서 트랜잭션을 중단합니다(Pubs 데이터베이스에 대한 변경 내용 취소).
트랜잭션 투표에 참여하는 모든 개체는 트랜잭션을 커밋하거나 중단합니다. 투표는 구성 요소를 만드는 1단계 샘플 코드의 다음 추출에 표시된 것처럼 코드에 투표 지침을 포함할 때 명시적으로 발생합니다 UpdateAuthorAddress
.
' Everything works.
contextstate.SetMyTransactionVote TxCommit
contextstate.SetDeactivateOnReturn True
Exit Sub
UnexpectedError:
' There's an error.
contextstate.SetMyTransactionVote TxAbort
contextstate.SetDeactivateOnReturn True
투표는 구성 요소에서 ValidateAuthorAddress
수행하는 것처럼 암시적으로도 발생합니다. 개체가 달리 선언하지 않는 한 COM+는 개체가 작업을 성공적으로 완료했지만 비활성화할 준비가 되지 않았다고 가정합니다. COM+는 다음을 가정합니다.
contextstate.SetMyTransactionVote TxCommit
contextstate.SetDeactivateOnReturn False
호출자에게 돌아오면 ValidateAuthorAddress
COM+는 해당 투표를 커밋으로 읽습니다. COM+는 이 경우 UpdateAuthorAddress
트랜잭션의 첫 번째 개체인 루트 개체를 비활성화할 때까지 투표 수를 계산하지 않습니다.
샘플 코드
구성 ValidateAuthorAddress
요소는 작성자의 주소를 간단히 확인합니다. UpdateAuthorAddress
COM+는 명시적으로 투표하지 않으므로 기본 투표 설정을 사용합니다.
Option Explicit
'
' Purpose: This class is used for validating an author's address
' (presumably right before updating that address in the
' database).
'
' Notes: This component could be in a transaction or not; it doesn't
' matter because it doesn't touch any data in a database.
'
Public Function ValidateAuthorAddress( _
ByVal strAddress As String, _
ByVal strCity As String, _
ByVal strState As String, _
ByVal strZip As String) As Boolean
' Default is to validate unless something is found to be wrong.
ValidateAuthorAddress = True
' Invalidate authors who live in New York City
' and authors who live in Montana.
'
If strCity = "New York" And strState = "New York" Then
ValidateAuthorAddress = False
ElseIf strState = "Montana" Then
ValidateAuthorAddress = False
End If
' Done
End Function
요약
구성 요소의 트랜잭션 특성을 Supported로 설정하면 호출 개체의 트랜잭션에 새 개체가 만들어질 수 있습니다. COM+는 호출자의 컨텍스트를 확인하여 새 개체의 트랜잭션 상태를 확인합니다. 호출자가 트랜잭션인 경우 COM+는 트랜잭션을 새 개체로 흐릅니다.
동일한 트랜잭션에 참여하는 모든 개체는 COM+가 개체의 컨텍스트에서 읽는 공통 트랜잭션 식별자를 공유합니다.
트랜잭션의 각 개체는 다른 개체와 독립적으로 투표합니다. COM+는 루트 개체가 비활성화될 때 투표 수를 계산합니다.
COM+가 개체를 비활성화하거나 COM+가 루트 개체를 비활성화하고 트랜잭션을 종료할 때까지 커밋과 중단 간에 개체의 트랜잭션 투표를 토글할 수 있습니다. 마지막 투표 설정만 계산됩니다. IContextState 및 IObjectContext 인터페이스는 다음 표와 같이 메서드를 제공하고 유사한 투표 결과를 생성합니다. 두 인터페이스 중 하나를 사용하여 트랜잭션에서 명시적으로 투표할 수 있습니다.
IContextState 조합 메서드 IObjectContext 동등한 메서드 SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = TrueSetComplete SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = FalseEnableCommit SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = TrueSetAbort SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = FalseDisableCommit COM+는 구성 요소가 명시적으로 투표하지 않는 한 개체의 투표를 EnableCommit에 해당하는 값으로 설정합니다.
명시적으로 투표하면 트랜잭션의 전체 기간을 줄이고 비용이 많이 드는 리소스 잠금을 해제할 수 있습니다.