Operações de administração COM+ dentro de transações

O banco de dados de registro COM+ (RegDB) é um gerenciador de recursos transacionado que pode participar de transações COM+. Isso permite que você execute operações de administração dentro de uma transação e tenha todas as alterações de configuração confirmadas ou anuladas como uma operação atômica, mesmo em vários computadores. Em algumas circunstâncias, pode ser muito benéfico fazer isso, embora haja comportamento de isolamento e bloqueio que você deve levar em conta, e a execução de tarefas de administração dentro de transações envolve pequenas alterações no modelo de programação de administração normal.

Benefícios de fazer operações de administração dentro de transações

  • **Consistência dos dados—**As operações de administração executadas em uma transação são confirmadas ou anuladas como um todo, embora existam alguns recursos de catálogo COM+ não transacionais para os quais esse pode não ser o caso. (Consulte Recursos de catálogo COM+ não transacionais abaixo.)
  • **Implantação consistente em várias máquinas—**Se você estiver implantando aplicativos COM+ em vários servidores, poderá garantir que todos os servidores fiquem com configurações idênticas.
  • **Dimensionamento e desempenho—**Quando você faz várias operações em uma transação, todas as gravações no RegDB são executadas de uma só vez. Gravações persistentes no RegDB são uma operação relativamente cara; se você estiver fazendo muitas gravações no RegDB, poderá obter um grande benefício de desempenho ao fazê-las todas de uma só vez, em vez de toda vez que chamar SaveChanges.

Comportamento de isolamento do RegDB

Para garantir a consistência adequada dos dados e as transações serializáveis, o RegDB impõe um comportamento específico de bloqueio e isolamento quando as operações de administração estão sendo executadas nas transações.

Sempre que um componente que está fazendo trabalho em uma transação chama qualquer método que causará uma gravação no catálogo COM+ — como SaveChanges, InstallApplication ou InstallComponent — um bloqueio de gravador é usado no código do servidor de catálogo COM+ que bloqueará a entrada de outros gravadores até que a transação atual seja confirmada ou abortada. Ou seja, os escritores só podem entrar se tiverem a afinidade de transação correta e estiverem participando da transação atual.

Os leitores não são bloqueados. No entanto, os dados que os leitores veem não refletem quaisquer alterações provisórias feitas na transação até que essa transação seja realmente confirmada. Todos os componentes que participam dessa transação veem estados de dados provisórios quando leem dados, mas todos os componentes fora da transação veem essas alterações somente após a conclusão da transação.

Comportamento SaveChanges

Para obter o comportamento de isolamento descrito acima, o RegDB fornece efetivamente um cache que é acionado por componentes dentro da transação. Isso altera o comportamento do método SaveChanges.

Normalmente, sem a presença de uma transação, todas as alterações pendentes são gravadas no catálogo quando você chama SaveChanges, e SaveChanges não retorna até que todas as gravações sejam concluídas. Isso garante que, se uma chamada para SaveChanges retornar com êxito, você poderá chamar StartApplication e ele ativará o aplicativo com dados atualizados.

No entanto, dentro de uma transação, SaveChanges afeta apenas o cache, não o RegDB em si, e SaveChanges retorna imediatamente se todas as alterações foram confirmadas transacionalmente para o RegDB. Não há garantia de que StartApplication esteja usando dados novos após o retorno de SaveChanges . Se você precisar chamar StartApplication neste contexto, é aconselhável esperar por algum período de tempo antes de fazê-lo.

Período de tempo limite da transação

Se você estiver fazendo várias operações de administração dentro de uma transação, pode ser uma transação de longa execução. Nesse caso, o valor de tempo limite da transação pode ser um problema. Isso é determinado pelo valor de tempo limite da transação definido para o componente que inicia a transação ou pela configuração de tempo limite em toda a máquina para a máquina em que esse componente está sendo executado. Se você estiver fazendo várias operações dentro de uma transação, é aconselhável definir o período de tempo limite da transação apropriado para um valor suficientemente longo e, se necessário, restaurar a configuração original quando terminar.

Recursos de catálogo COM+ não transacionais

O registro, o sistema de arquivos e o Windows Installer (MSI) são recursos de catálogo COM+ que não são transacionais.

Observação

Se houver um erro que anule uma transação, as alterações nesses recursos podem não ser revertidas.

 

Se houver um erro ao instalar um aplicativo COM+ existente a partir de um arquivo .msi, o aplicativo não aparecerá no snap-in Serviços de Componentes, mas poderá aparecer em Adicionar ou Remover programas, caso em que você precisará removê-lo manualmente.

Recuperando-se em caso de travamento do sistema

Se um componente que faz operações de administração dentro de uma transação travar enquanto mantém um bloqueio de gravador no código do servidor de catálogo, ele impediria que todos os outros fizessem alterações no catálogo. Se isso acontecer, você pode limpar o bloqueio no catálogo desligando e reiniciando o aplicativo do sistema.

Script com um objeto TransactionContext

Uma maneira simples de fazer operações de administração dentro de transações é usar um objeto TransactionContext para controlar a transação. Por exemplo, o seguinte script do Visual Basic demonstra como adicionar transacionalmente dois novos aplicativos para que ambos os aplicativos ou nenhum aplicativo é criado:

Dim txctx
Dim cat
Dim apps
Dim app1
Dim app2
  
WScript.Echo "Starting"
Set txctx = CreateObject("TxCtx.TransactionContext")
Set cat = txctx.CreateInstance("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")
Set app1 = apps.Add
app1.Value("Name") = "Test App #1"
apps.SaveChanges
Set app2 = apps.Add
app2.Value("Name") = "Test App #2"
apps.SaveChanges
  
WScript.Echo "Ending"
txctx.Commit

Manipulando erros de administração COM+

Exemplo introdutório usando o catálogo de administração COM+

Visão geral dos objetos COMAdmin

Recuperando coleções no catálogo COM+

Definindo propriedades e salvando alterações no catálogo COM+