Usando fluxos de log com KTM

Os TPSs (sistemas de processamento de transações) baseados em KTM devem registrar a atividade de transação usando o CLFS ( Common Log File System ). KTM cria um fluxo de log para cada objeto do gerenciador de transações. Cada gerenciador de recursos deve criar seu próprio fluxo de log.

Criando fluxos de log para objetos do Gerenciador de Transações

Quando o gerenciador de recursos chama ZwCreateTransactionManager, você deve especificar o nome de um fluxo de log CLFS. Se o fluxo especificado não existir, o KTM o criará. Se o fluxo já existir, ZwCreateTransactionManager o reabrirá. O KTM atribui esse fluxo de log ao objeto do gerenciador de transações.

A KTM usa o fluxo de log do objeto do gerenciador de transações para registrar informações de estado internas sobre o objeto do gerenciador de transações e todos os objetos do gerenciador de recursos, objetos de transação e objetos de alistamento associados ao objeto do gerenciador de transações. Se as operações transacionais forem interrompidas antes de serem concluídas, a KTM poderá usar as informações no log para determinar se deseja confirmar ou reverter as transações.

A KTM não registra os dados de transação que os gerenciadores de recursos recebem ou enviam aos clientes. Os gerenciadores de recursos devem usar seus próprios fluxos de log para registrar essas informações.

Os gerenciadores de recursos podem chamar ZwQueryInformationTransactionManager para obter informações sobre o fluxo de log de um objeto do gerenciador de transações, como o nome do caminho do fluxo de log ou o GUID que a KTM atribui ao fluxo.

Criando fluxos de log para resource managers

Em seu código de inicialização, cada gerenciador de recursos deve chamar ClfsCreateLogFile para criar seu próprio fluxo de log. Cada gerenciador de recursos deve usar seu fluxo para registrar todas as informações sobre transações necessárias para confirmar, reverter ou recuperar os dados da transação.

KTM e todos os gerenciadores de recursos de um TPS podem usar um único arquivo de log, mas cada componente TPS deve usar um fluxo diferente dentro do arquivo de log. Para obter informações sobre como especificar fluxos individuais em um arquivo de log, consulte ClfsCreateLogFile.

Periodicamente, o KTM cria uma área de reinicialização no fluxo de log do gerenciador de transações. Quando o KTM executa uma operação de recuperação, ele lê a última área de reinicialização para recuperar o estado dos objetos que estavam abertos antes do sistema ser desligado. Da mesma forma, o gerenciador de recursos deve criar periodicamente áreas de reinicialização em seu fluxo de log. Por exemplo, o gerenciador de recursos pode criar uma área de reinicialização sempre que uma operação transacional for concluída.

Para obter mais informações sobre áreas de reinicialização em fluxos de log CLFS, consulte Leitura de registros de reinicialização de um fluxo CLFS. Além disso, consulte as rotinas ClfsWriteRestartArea, ClfsReadRestartArea e ClfsReadPreviousRestartArea .

Usando fluxos de log para recuperação

Depois que o gerenciador de recursos chamar ZwCreateTransactionManager, ele deverá chamar ZwRecoverTransactionManager. A rotina ZwRecoverTransactionManager lê o fluxo de log do objeto do gerenciador de transações para recuperar o estado do TPS para um ponto bom conhecido. Se o computador for desligado corretamente ou não tiver sido desligado após o último carregamento do gerenciador de recursos, o fluxo de log conterá informações mínimas. Se ocorreu uma falha no sistema, o fluxo de log contém informações de recuperação suficientes para restaurar todas as transações para um estado conhecido.

Depois que o gerenciador de recursos chamar ZwCreateResourceManager, ele deverá chamar ZwRecoverResourceManager. A rotina ZwRecoverResourceManager tenta recuperar as transações associadas a cada uma das inscrição do gerenciador de recursos. Para obter mais informações sobre como recuperar transações de um gerenciador de recursos, consulte Manipulando operações de recuperação.

Armazenando dados de transação

Os gerenciadores de recursos que usam fluxos de log CLFS devem armazenar dados de transação em áreas de marshalling do CLFS. O CLFS move periodicamente os dados da área de marshalling do fluxo de log para um meio de armazenamento permanente. Para registrar uma operação que modifica dados, um gerenciador de recursos pode fazer o seguinte:

  1. Copie os dados originais, antes que a operação de gravação os modifique, para a área de marshalling.

  2. Execute a operação em uma cópia dos dados sem modificar o meio de armazenamento permanente do banco de dados.

  3. Copie os novos dados para a área de marshaling.

Se o gerenciador de recursos receber uma notificação de reversão, ele poderá restaurar os dados originais do fluxo de log. Se receber uma notificação de confirmação, o gerenciador de recursos poderá copiar os dados modificados do fluxo de log para o meio de armazenamento permanente do banco de dados.

Os gerenciadores de recursos também podem usar a rotina ZwSetInformationEnlistment para armazenar informações de recuperação em um objeto de inscrição. A KTM salva essas informações em seu fluxo de log e as lê do fluxo de log durante as operações de recuperação. Portanto, um gerenciador de recursos pode obter essas informações de recuperação a qualquer momento chamando ZwQueryInformationEnlistment.