Transações (Eventos do Windows)

Aplica-se a: Windows | Windows Server

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 será iniciado 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 que o banco de dados está em um estado legal.
  • Isolamento: As transações são isoladas das 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. Opcionalmente, a durabilidade de uma transação pode ser 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 momento em que a transação começa. Isso é chamado de isolamento 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 de JetCommitTransaction ser chamado, 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 o tópico Indexação na tabela .

  3. Chame JetGetTableColumnInfo no registro atual com JET_ColInfo especificado no parâmetro InfoLevel para recuperar a ID da 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 instantâneo isolamento tem algumas diferenças importantes em relação ao isolamento de banco de dados relacional tradicional e aos modelos de bloqueio. Quando uma transação lê uma linha, ela sempre pode acessar a linha sem falhar ou esperar 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, que é a primeira gravação ganha. 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 repita 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 concluído sua atualização. Normalmente, uma transação testará se ela pode atualizar uma linha dentro da chamada JetUpdate . Se ele 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 de processo inesperado ou desligamento do sistema.

As transações podem estar aninhadas em 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é que a chamada mais externa para confirmar a transação com JetCommitTransaction.

As colunas de atualização de caução 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 caução, colunas que foram criadas com Jet_bitColumnEscrowUpdate.