Transações (Eventos do Windows)

Aplica-se a: Windows | Servidor Windows

Transactions

As transações ESE são unidades lógicas de processamento que controlam como um aplicativo vê e manipula linhas no banco de dados. Seu aplicativo pode usar pontos de salvamento de transação para determinar se deseja manter ou descartar um determinado conjunto de alterações no banco de dados. Todas as transações no ESE são atômicas, consistentes, isoladas e duráveis (ACID), conforme descrito abaixo:

  • Atômica: Todas as atualizações na transação aparecem no banco de dados ou são descartadas.
  • Consistente: O banco de dados sempre começará em um estado legal e sempre terminará em outro estado legal. Para aplicativos ESE, o mecanismo de banco de dados controlará algumas restrições simples, por exemplo, a exclusividade de um índice exclusivo, mas o próprio aplicativo definirá quase todos os outros aspectos do que significa para o banco de dados estar em um estado legal.
  • Isolamento: As transações são isoladas de atualizações por outras sessões. Uma transação nunca verá um conjunto parcial de alterações feitas por outra transação.
  • Durável: Depois que o mecanismo de banco de dados reconhece que uma transação foi confirmada, suas alterações são persistentes no banco de dados. A durabilidade de uma transação pode ser opcionalmente dispensada por motivos de desempenho.

As transações são executadas dentro dos limites das chamadas para JetBeginTransaction e JetCommitTransaction ou JetRollback. Quando o aplicativo insere a transação, o banco de dados aparece congelado na instância no tempo em que a transação começa. Isso é chamado de isolamento de instantâneo. Se a transação for encerrada chamando JetRollback, nenhuma das operações executadas na transação será confirmada no banco de dados. Se o processo ou o computador falhar antes que JetCommitTransaction seja chamado, ele será o mesmo que chamar JetRollback.

Este procedimento mostra como iniciar e confirmar uma transação que lê e atualiza dados em um banco de dados.

Para iniciar e confirmar uma transação

  1. Chame JetBeginTransaction ou JetBeginTransaction2 com a ID da sessão para iniciar a transação.

  2. Mova o cursor para o registro desejado chamando JetMove com JET_MoveFirst especificado no parâmetro cRow . Para obter mais informações sobre como mover o cursor, consulte a Indexação no tópico Tabela .

  3. Chame JetGetTableColumnInfo no registro atual com JET_ColInfo especificado no parâmetro InfoLevel para recuperar a ID da coluna para a coluna. A ID da coluna é retornada na estrutura JET_COLUMNDEF .

  4. Chame JetSetColumn com a ID da sessão, a ID da tabela e a ID da coluna atualizada. Os dados da coluna estão contidos no parâmetro pvData .

  5. Chame JetCommitTransaction para confirmar a transação no banco de dados.

A maneira como um mecanismo de banco de dados ESE implementa o isolamento de instantâneo tem algumas diferenças importantes em relação aos modelos tradicionais de isolamento e bloqueio de banco de dados relacional. Quando uma transação lê uma linha, ela sempre pode acessar a linha sem falhar ou aguardar que outras sessões liberem um bloqueio. Quando uma transação tenta atualizar uma linha, ela terá êxito se for a primeira sessão a atualizar essa linha, essa é a primeira vez que o gravador vence. Se a sessão não for o primeiro gravador, ela falhará imediatamente com um erro de conflito de gravação. Em seguida, a sessão deve anular sua transação, aguardar (geralmente por meio de um atraso aleatório), para que a outra transação confirme suas alterações e tente novamente a transação. O mecanismo de banco de dados não fará com que essa sessão aguarde automaticamente até que a outra transação tenha terminado sua atualização. Normalmente, uma transação testará se ela pode atualizar uma linha dentro da chamada JetUpdate . Se não puder bloquear a linha para atualização, o JetUpdate falhará com JET_errWriteConflict.

As sessões são limitadas a um thread desde o momento em que a transação começa até o final da transação. É recomendável que todas as operações de atualização e recuperação sejam executadas em uma transação. O ESE também dá suporte a modificações de esquema, como a criação de tabelas e a adição de colunas dentro da transação. As modificações de atualização e de esquema podem ser executadas na mesma transação. Depois que a transação for concluída com JetCommitTransaction, a atualização será registrada no arquivo de log de transações. Esses arquivos podem ser usados para manter um estado logicamente consistente no caso de um encerramento inesperado do processo ou desligamento do sistema.

As transações podem ser aninhadas até 7 níveis com chamadas correspondentes para JetBeginTransaction e JetCommitTransaction ou JetRollback aninhadas entre si. Isso permite que o aplicativo reverta uma parte da transação sem precisar recuar de toda a transação. A chamada aninhada para JetCommitTransaction significa que esse nível de processamento está concluído; no entanto, a transação não é confirmada no banco de dados até a chamada mais externa para confirmar a transação com JetCommitTransaction.

As colunas de atualização do Escrow podem ser atualizadas simultaneamente por várias sessões sem falhar com Jet_errWriteConflict. A função JetEscrowUpdate só pode ser chamada em colunas de escrow, colunas que foram criadas com Jet_bitColumnEscrowUpdate.