Partilhar via


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 abortadas como uma operação atômica, mesmo em vários computadores. Em algumas circunstâncias, pode ser muito benéfico fazer isso, embora haja isolamento e comportamento de bloqueio que você deve levar em conta, e executar 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 abortadas 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 do catálogo COM+ não transacional 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 vez, em vez de toda vez que ligar para 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 um trabalho dentro de uma transação chama qualquer método que causará uma gravação no catálogo COM+ — como SaveChanges, InstallApplicationou InstallComponent—, um bloqueio de gravador é obtido no código do servidor de catálogo COM+ que impedirá 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 dentro da 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 pelos componentes dentro da transação. Isso altera o comportamento do SaveChanges método.

Normalmente, sem a presença de uma transação, todas as alterações pendentes são gravadas no catálogo quando você chama SaveChangese 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 próprio RegDB, e SaveChanges retorna imediatamente se todas as alterações foram confirmadas transacionalmente no RegDB. Não há garantia de que StartApplication esteja usando dados novos após o retorno SaveChanges. Se você precisar ligar para StartApplication neste contexto, é aconselhável esperar por algum período de tempo antes de fazê-lo.

Período de Time-Out 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 duraçã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 de 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 transacional

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 não podem 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/Remover programas, caso em que você precisará removê-lo manualmente.

Recuperação 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 bloquearia todos os outros de fazer quaisquer alterações no catálogo. Se isso acontecer, você pode limpar o bloqueio no catálogo desligando e reiniciando o aplicativo System.

Criando scripts 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 seja 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

Tratamento de erros de administração COM+

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

Visão geral do de objetos COMAdmin

Recuperando coleções no catálogo COM+

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