Etapa 2: extensão de uma transação entre componentes
Objetivos
Nesta etapa, você aprenderá sobre os seguintes recursos:
- Fluxo de transação
- Como vários objetos votam em uma transação
Descrição
Etapa 1: criação de um componente transacional mostra como escrever um componente transacional simples que atualiza as informações do autor no banco de dados Pubs do Microsoft SQL Server. A etapa 2 mostra o que acontece quando uma transação é estendida por vários componentes.
De acordo com o modelo de programação COM+, UpdateAuthorAddress
chama outro componente durante a conclusão de seu trabalho. O segundo componente, ValidateAuthorAddress
, valida o endereço do autor e retorna os resultados para seu chamador, UpdateAuthorAddress
.
Ao contrário de seu chamador, ValidateAuthorAddress
não requer uma transação, mas ainda pode participar da transação de seu chamador. Nesta etapa, seu valor de atributo de transação é definido como Com Suporte, conforme mostrado na ilustração a seguir, que estende a transação existente para o novo objeto.
O valor do atributo Com Suporte estende (ou flui) uma transação existente somente quando o chamador é transacional. Quando UpdateAuthorAddress
chama ValidateAuthorAddress
, COM+ primeiro examina o contexto do chamador para ver se ele é transacional. Em seguida, o COM+ examina os atributos de serviço definidos em ValidateAuthorAddress
e atribui ao novo objeto o mesmo identificador de transação atribuído ao objeto chamador. Para entender melhor esse processo, consulte Ativação de contexto.
Como eles compartilham o mesmo identificador de transação, ambos os objetos devem concluir seu trabalho com êxito ou o COM+ anula a transação (desfazendo todas as alterações feitas no banco de dados Pubs).
Todos os objetos que participam de uma transação votam para confirmar ou anular a transação. A votação ocorre explicitamente quando você inclui instruções de votação em seu código, conforme mostrado na extração do Código de Exemplo da Etapa 1 a seguir, que cria o componente UpdateAuthorAddress
:
' Everything works.
contextstate.SetMyTransactionVote TxCommit
contextstate.SetDeactivateOnReturn True
Exit Sub
UnexpectedError:
' There's an error.
contextstate.SetMyTransactionVote TxAbort
contextstate.SetDeactivateOnReturn True
A votação também ocorre implicitamente, como é feito no componente ValidateAuthorAddress
. A menos que o objeto declare o contrário, o COM+ pressupõe que um objeto concluiu seu trabalho com êxito, mas ainda não está pronto para ser desativado. O COM+ faz a seguinte suposição:
contextstate.SetMyTransactionVote TxCommit
contextstate.SetDeactivateOnReturn False
Quando ValidateAuthorAddress
retorna ao chamador, o COM+ lê seu voto como uma confirmação. O COM+ não conta os votos até desativar o objeto raiz, que é o primeiro objeto na transação, nesse caso, o objeto UpdateAuthorAddress
.
Código de exemplo
O componente ValidateAuthorAddress
faz uma verificação simples do endereço do autor. Como UpdateAuthorAddress
não vota explicitamente, o COM+ usa as configurações de voto padrão.
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
Resumo
Definir o atributo de transação de um componente como Com Suporte pode resultar na criação do objeto na transação de chamada do objeto. O COM+ examina o contexto do chamador para determinar o status transacional do novo objeto. Se o chamador for transacional, o COM+ fluirá a transação para o novo objeto.
Todos os objetos que participam da mesma transação compartilham um identificador de transação comum, que o COM+ lê do contexto do objeto.
Cada objeto em uma transação vota independentemente de outros objetos. O COM+ conta os votos quando o objeto raiz é desativado.
Você pode alternar o voto de transação de um objeto entre confirmar e anular até que o COM+ desative o objeto ou até que o COM+ desative o objeto raiz e encerre a transação. Somente a última configuração de voto conta. As interfaces IContextState e IObjectContext fornecem métodos e que produzem resultados de votação semelhantes, conforme mostrado na tabela a seguir. Você pode usar qualquer interface para votar explicitamente em uma transação.
Métodos de combinação IContextState Método IObjectContext equivalente SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = VerdadeiroSetComplete SetMyTransactionVote txVote = TxCommit
SetDeactivateOnReturn bDeactivate = FalsoEnableCommit SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = VerdadeiroSetAbort SetMyTransactionVote txVote = TxAbort
SetDeactivateOnReturn bDeactivate = FalsoDisableCommit O COM+ define o voto de um objeto como o equivalente a EnableCommit, a menos que o componente vote explicitamente.
A votação explícita pode reduzir a duração geral da transação e liberar bloqueios de recursos caros.