Compartilhar via


Função JetBeginTransaction

Aplica-se a: Windows | Windows Server

Função JetBeginTransaction

A função JetBeginTransaction faz com que uma sessão insira uma transação e crie um novo ponto de salvamento. Essa função pode ser chamada mais de uma vez em uma única sessão para causar a criação de pontos de salvamento adicionais. Esses pontos de salvamento podem ser usados para manter ou descartar seletivamente as alterações no estado do banco de dados.

    JET_ERR JET_API JetBeginTransaction(
      __in          JET_SESID sesid
    );

Parâmetros

sesid

A sessão a ser usada para essa chamada.

Valor Retornado

Essa função retorna o tipo de dados JET_ERR com um dos seguintes códigos de retorno. Para obter mais informações sobre os possíveis erros do ESE, consulte Erros extensíveis do mecanismo de armazenamento e parâmetros de tratamento de erros.

Código de retorno

Descrição

JET_errSuccess

A operação foi concluída com sucesso.

JET_errClientRequestToStopJetService

Não é possível concluir a operação porque todas as atividades na instância associada à sessão cessaram como resultado de uma chamada para JetStopService.

JET_errInstanceUnavailable

Não é possível concluir a operação porque a instância associada à sessão encontrou um erro fatal que exige que o acesso a todos os dados seja revogado para proteger a integridade desses dados.

Esse erro só será retornado pelo Windows XP e versões posteriores.

JET_errNotInitialized

Não é possível concluir a operação porque a instância associada à sessão ainda não foi inicializada.

JET_errRestoreInProgress

Não é possível concluir a operação porque uma operação de restauração está em andamento na instância associada à sessão.

JET_errSessionSharingViolation

A mesma sessão não pode ser usada para mais de um thread ao mesmo tempo. Esse erro só será retornado pelo Windows XP e versões posteriores.

JET_errTermInProgress

Não é possível concluir a operação porque a instância associada à sessão está sendo desligada.

JET_errTransTooDeep

Uma nova transação não pode ser iniciada porque a sessão já está na profundidade máxima do ponto de salvamento permitida pelo mecanismo de banco de dados.

Com êxito, a sessão fornecida estará dentro de uma transação. Se a sessão tiver sido anteriormente dentro de uma transação, um novo ponto de salvamento será criado.

Em caso de falha, o estado transacional da sessão permanecerá inalterado. Nenhuma alteração no estado do banco de dados ocorrerá.

Comentários

O mecanismo de banco de dados fornece um modelo de isolamento instantâneo para suas transações. Isso significa que, quando uma sessão entra pela primeira vez em um estado transacional, a sessão verá todo o banco de dados congelado no tempo no início da transação. Uma sessão não precisa ler os dados de bloqueio porque ela sempre pode acessar a versão apropriada desses dados. Isso significa que uma sessão que está atualizando dados nunca bloqueará uma sessão diferente de ler esses dados.

Outra implicação do uso do isolamento de instantâneo é o modelo de bloqueio usado para atualizações. O mecanismo de banco de dados concederá um bloqueio de gravação em uma determinada parte dos dados à primeira sessão que o solicita. Esse bloqueio de gravação é liberado quando a transação é confirmada ou anulada completamente de modo que a sessão não esteja mais em uma transação. Enquanto uma sessão mantém um bloqueio de gravação, qualquer outra sessão que solicite o mesmo bloqueio de gravação não será bloqueada até que o bloqueio de gravação esteja disponível. Em vez disso, essa segunda sessão falhará imediatamente com JET_errWriteConflict. Para resolve esse conflito, a segunda sessão deve anular (ou confirmar) completamente sua transação, aguardar algum pequeno período de tempo para que a primeira sessão confirme ou anule sua transação e comece tudo novamente.

Em suporte ao isolamento instantâneo, o mecanismo de banco de dados armazena todas as versões de todos os dados modificados na memória desde o momento em que a transação ativa mais antiga em qualquer sessão foi iniciada pela primeira vez. Isso tem implicações importantes para seu aplicativo. Qualquer comportamento que faça com que um grande número de versões seja compilado na memória pode fazer com que a instância extenue o tamanho máximo do repositório de versão (consulte JET_paramMaxVerPages em Parâmetros do Sistema para obter mais informações). Esse comportamento inclui, mas não se limita a atualizações muito grandes em uma única transação e transações de execução muito longa. Como resultado, é muito importante configurar corretamente o tamanho do repositório de versão para a carga transacional esperada do aplicativo. Também é importante ter muito cuidado para limitar o número de atualizações executadas em uma única transação. Além disso, é importante tornar as transações o mais curtas possível em cenários de alta carga.

É altamente recomendável que o aplicativo sempre esteja no contexto de uma transação ao chamar APIs do ESE que recuperam ou atualizam dados. Se isso não for feito, o mecanismo de banco de dados encapsulará automaticamente cada chamada à API do ESE desse tipo em uma transação em nome do aplicativo. O custo dessas transações muito curtas pode se somar rapidamente em alguns casos.

O comportamento padrão do mecanismo é restringir o uso de uma sessão para o mesmo thread desde o momento em que a primeira chamada para JetBeginTransaction é feita até o momento em que a chamada correspondente para JetCommitTransaction ou JetRollback é feita. Esse comportamento pode ser alterado para remover essa restrição definindo um contexto de sessão personalizado usando JetSetSessionContext e JetResetSessionContext.

O mecanismo de banco de dados também dá suporte a modificações de esquema transacional. Por exemplo, é possível iniciar uma nova transação, criar uma tabela, adicionar algumas colunas, criar um índice ou duas e anular a transação. Os elementos de esquema que acabaram de ser adicionados serão removidos do banco de dados. Também é possível misturar modificações de esquema e atualizações de banco de dados comuns na mesma transação.

Requisitos

Requisito Valor

Cliente

Requer Windows Vista, Windows XP ou Windows 2000 Professional.

Servidor

Requer o Windows Server 2008, o Windows Server 2003 ou o Windows 2000 Server.

Cabeçalho

Declarado em Esent.h.

Biblioteca

Use ESENT.lib.

DLL

Requer ESENT.dll.

Consulte Também

JET_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
Parâmetros do sistema