Usando componentes não transacionais em uma transação
Muitas vezes é útil colocar componentes não transacionais em uma transação para aproveitar as propriedades ACID das transações. Por exemplo, se você tiver componentes herdados não transacionais usados para atualizar senhas em uma rede, poderá colocar esses componentes em uma transação para garantir que as atualizações de senha sejam consistentes em toda a rede.
O objeto de contexto de transação é um objeto genérico que permite que clientes não transacionais combinem o trabalho de vários objetos COM em uma única transação, sem exigir que você desenvolva um novo componente especificamente para essa finalidade. Em contraste com uma transação automática, o objeto de contexto de transação requer que seu cliente confirme ou anule explicitamente a transação.
Por padrão, o valor do atributo de transação do objeto de contexto de transação é definido como Obrigatório. COM+ anula a transação se o cliente liberar o objeto de contexto de transação sem emitir explicitamente uma chamada de confirmação ou anulação.
O exemplo do Visual Basic a seguir mostra como um cliente não transacional pode compor o trabalho feito por mais de um objeto em uma única transação:
Dim objTxCtx As TransactionContext
Dim objCat As MyDLL.Ccat ' Ccat is a user-defined component.
Dim objDog As MyDLL.Cdog ' Cdog is a user-defined component.
' Get TransactionContext object.
Set objTxCtx = _
CreateObject ("TxCtx.TransactionContext")
' Create instances of Cat and Dog.
Set objCat = _
objTxCtx.CreateInstance ("MyDLL.Ccat")
Set objDog = _
objTxCtx.CreateInstance ("MyDLL.Cdog")
' Both objects do work.
objDog.Bark
objCat.Hiss
' Commit the transaction.
objTxCtx.Commit
Limitações do objeto de contexto de transação
A seguir estão algumas limitações importantes do objeto de contexto de transação:
Ao usar um objeto de contexto de transação, a lógica do aplicativo que combina o trabalho de vários objetos em uma única transação é vinculada a uma implementação de cliente não transacional específica e algumas vantagens do uso de componentes COM são perdidas. Essas vantagens perdidas incluem o seguinte:
- Capacidade de reutilizar a lógica do aplicativo como parte de uma transação ainda maior
- Imposição de caução declarativa
- Flexibilidade para executar a lógica remotamente a partir do cliente
O objeto de contexto de transação é executado no processo com o cliente não transacional, o que significa que COM+ deve estar disponível no computador cliente não transacional. Isso pode não ser um problema, por exemplo, quando o objeto de contexto de transação é usado de uma página ASP (Active Server Pages) que está sendo executada no mesmo servidor que COM+.
Você não obtém um contexto para o cliente não transacional quando cria um objeto de contexto de transação. O trabalho transacional só pode ser feito indiretamente, por meio de objetos COM criados usando o objeto de contexto de transação. Em particular, o cliente não transacional não pode usar dispensadores de recursos COM+ (como ODBC) e ter o trabalho incluído na transação. Por exemplo, os desenvolvedores podem estar familiarizados com a seguinte sintaxe para fazer trabalho transacional em sistemas de banco de dados relacionais:
BEGIN TRANSACTION DoWork COMMIT TRANSACTION
Usar o objeto de contexto de transação de maneira semelhante não produz o resultado desejado:
Set objTxCtx = CreateObject ("TxCtx.TransactionContext") DoWork objTxCtx.Commit Set objTxCtx = Nothing
A chamada para DoWork neste exemplo não está inscrita em uma transação. Em vez disso, você deve criar um componente COM que chama DoWork, criar uma instância de objeto desse componente usando o objeto de contexto de transação e, em seguida, chamar esse objeto do cliente não transacional para que o trabalho faça parte da transação controlada pelo cliente.