Compartilhar via


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.

Diagrama que mostra a extensão da 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 = Verdadeiro
    SetComplete
    SetMyTransactionVote txVote = TxCommit
    SetDeactivateOnReturn bDeactivate = Falso
    EnableCommit
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturn bDeactivate = Verdadeiro
    SetAbort
    SetMyTransactionVote txVote = TxAbort
    SetDeactivateOnReturn bDeactivate = Falso
    DisableCommit
  • 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.

Etapa 1: criação de um componente transacional

Etapa 3: reutilização de componentes

Ativação de contexto

Gerenciamento de transações automáticas em COM+