루트 개체에 알림으로써 트랜잭션 속도 조정
자동 트랜잭션을 효과적으로 사용하려면 각 트랜잭션 구성 요소가 작업을 완료했음을 나타내야 합니다. 개체 인스턴스가 작업을 성공적으로 완료하면 IObjectContext::SetComplete 메서드를 호출하여 일관되고 완료된 플래그를 True로 설정해야 합니다. 트랜잭션의 모든 내부 개체가 SetComplete를 호출한 경우 SetComplete 메서드를 호출하여 루트 개체를 명시적으로 비활성화하여 트랜잭션을 종료할 수 있습니다. 루트 개체가 작업을 완료했음을 명시적으로 표시하여 트랜잭션의 길이를 줄일 수 있습니다.
트랜잭션 개체 메서드가 실패하면 개체는 IObjectContext::SetAbort 메서드를 호출하여 일관된 플래그를 False로 설정하고 완료 플래그를 True로 설정해야 합니다. SetAbort 메서드를 호출하면 개체가 호출자에게 컨트롤을 반환하고 트랜잭션이 궁극적으로 중단되도록 합니다.
그러나 SetAbort 를 호출하는 개체가 트랜잭션의 루트가 아닌 한, 결국 중단에서 아무것도 저장할 수 없는 경우에도 트랜잭션이 계속 실행됩니다. 실패한 트랜잭션의 종료 속도를 높이려면 SetAbort를 호출하도록 루트 개체에 경고하는 오류가 발생할 수 있습니다. 완료를 위해 루트 개체는 클라이언트에 오류 메시지를 보내야 합니다.
오류를 처리하기 위해 수행할 수 있는 여러 가지 방법이 있지만 내부 개체와 루트 개체 간의 통신을 명확하게 조정해야 합니다.
다음 Visual Basic 코드 조각은 오류 처리에 대한 한 가지 방법을 보여 줍니다. 첫 번째 조각에서 내부 개체는 SetAbort를 호출하고, 오류를 발생시키고, 다음과 같이 오류 메시지를 생성합니다.
Dim ObjCtx As ObjectContext
Dim ErrorCode As Long, Description As String
Set ObjCtx = GetObjectContext()
ObjCtx.SetAbort
ErrorCode = vbObjectError + 5
Description = "Some meaningful message"
Err.Raise ErrorCode, , Description
두 번째 조각에서 루트 개체는 오류를 처리하고 다음과 같이 메시지를 클라이언트에 전달합니다.
Sub MyObjMethod1()
On Error GoTo MyObjMethod1_err
Dim ObjCtx As ObjectContext
Dim InteriorObj1 As Cinterior ' Cinterior is a user-defined object.
Set ObjCtx = GetObjectContext()
Set InteriorObj1 = CreateObject ("MyDll.Cinterior")
InteriorObj1.Method1
' If the call completed successfully, then...
ObjCtx.SetComplete
Exit Sub
MyObjMethod1_err:
' Doom the transaction and exit.
ObjCtx.SetAbort
' Pass the message back to client.
Err.Raise Err.Number, , Err.Description
End Sub
관련 항목