Função JetEscrowUpdate
Aplica-se a: Windows | Windows Server
Função JetEscrowUpdate
A função JetEscrowUpdate executa uma operação de adição atômica em uma coluna. Essa função permite que várias sessões atualizem o mesmo registro simultaneamente sem conflitos.
JET_ERR JET_API JetEscrowUpdate(
__in JET_SESID sesid,
__in JET_TABLEID tableid,
__in JET_COLUMNID columnid,
__in void* pv,
__in unsigned long cbMax,
__out_opt void* pvOld,
__in unsigned long cbOldMax,
__out_opt unsigned long* pcbOldActual,
__in JET_GRBIT grbit
);
Parâmetros
sesid
A sessão a ser usada para essa chamada.
Tableid
O cursor a ser usado para essa chamada.
Columnid
A columnid da coluna a ser atualizada.
pv
Um ponteiro para um buffer que contém o complemento para a coluna.
cbMax
O tamanho do buffer que contém o complemento.
pvOld
O buffer de saída que receberá o valor atual da coluna, conforme armazenado no banco de dados (o controle de versão é ignorado).
cbOldMax
O tamanho máximo do buffer de saída que receberá o valor atual da coluna. Atualmente, há suporte apenas para JET_coltypLong, portanto, o buffer deve ter 4 bytes ou 0 bytes de comprimento. Se pvOld for NULL, cbOldMax deverá ser 0.
pcbOldActual
Recebe a quantidade real de dados de valor bruto recebidos no buffer de saída.
grbit
Um grupo de bits que especifica zero ou mais das opções a seguir.
Valor |
Significado |
---|---|
JET_bitEscrowNoRollback |
Mesmo que a sessão que executa a atualização de caução tenha sua reversão de transação, essa atualização não será desfeita. Observe que, como os registros de log podem não ser liberados para o disco, as atualizações de caução recentes feitas com esse sinalizador podem ser perdidas se houver uma falha. |
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 de 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_errAlreadyPrepared |
O cursor tem uma atualização preparada com JetPrepareUpdate. |
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_errInvalidBufferSize |
Um tamanho de buffer inválido foi passado. Atualmente, há suporte apenas para JET_coltypLong, portanto, o buffer deve ser de 4 bytes. |
JET_errInvalidOperation |
Uma coluna inválida foi especificada. A coluna deve ser criada com JET_bitColumnEscrowUpdate especificado. Somente colunas fixas de JET_coltypLong podem ser especificadas como atualizáveis. |
JET_errNoCurrentRecord |
O cursor deve estar em um registro para atualizar uma coluna. |
JET_errNotInTransaction |
As atualizações de caução só podem ser executadas por sessões em uma transação. |
JET_errNotInitialized |
Não é possível concluir a operação porque a instância associada à sessão ainda não foi inicializada. |
JET_errPermissionDenied |
O cursor não pode ser somente leitura e atualizar um registro. |
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 de 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_errTransReadOnly |
A sessão deve ter permissões de gravação para atualizar um registro. |
JET_errWriteConflict |
O erro retornado quando uma atualização conflitante é solicitada. |
Comentários
Normalmente, se duas sessões tentarem atualizar um registro simultaneamente, a segunda sessão receberá um erro JET_errWriteConflict, a menos que as sessões sejam completamente serializadas. Para serializar duas sessões que atualizam o mesmo registro, a segunda sessão deve iniciar sua transação após a primeira transação confirmar sua transação. Confira JetBeginTransaction para obter mais informações.
Várias colunas no mesmo registro podem ser atualizadas. As atualizações não afetam umas às outras.
Somente as operações JetEscrowUpdate são compatíveis entre si. Se duas sessões diferentes tentarem preparar atualizações ou excluir o mesmo registro, um conflito de gravação será gerado.
Sessão B |
||||
---|---|---|---|---|
JetEscrowUpdate |
JET_errSuccess |
JET_errWriteConflict |
JET_errWriteConflict |
|
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
||
Sessão A |
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
As operações de caução têm controle de versão e são desfeitas usando JetRollback (a menos que JET_bitEscrowNoRollback tenha sido especificado). JetEscrowUpdate retorna o valor bruto da coluna armazenada no banco de dados, pois um aplicativo pode querer executar uma ação especial quando um valor sentinela é atingido. JetRetrieveColumn retorna a exibição com controle de versão correta da coluna, ignorando as atualizações feitas por sessões simultâneas.
Considerando duas sessões operando na mesma coluna do mesmo registro, podemos ver como isso funciona. Suponha que a coluna comece com um valor de 0.
Session |
Operação |
Valor armazenado |
Valor retornado |
---|---|---|---|
A |
|||
A |
0 |
||
A |
JetEscrowUpdate (4) |
4 |
0 |
A |
4 |
||
B |
|||
B |
0 |
||
B |
JetEscrowUpdate (3) |
7 |
4 |
B |
3 |
||
A |
JetEscrowUpdate (2) |
9 |
7 |
A |
JetEscrowUpdate (-7) |
2 |
9 |
B |
3 |
||
A |
-1 |
||
B |
-1 |
||
A |
-1 |
Não é recomendável substituir um registro na mesma transação que executa atualizações de caução em um registro. Em particular, se uma atualização em um registro for preparada com um JET_TABLEID e um JET_TABLEID diferente for usado para escrow atualizar o registro, o caução atualizado será perdido quando JetUpdate for chamado. Isso acontece mesmo que a coluna de caução não tenha sido definida durante a atualização.
Quando uma coluna atualizável de caução tem um valor igual a zero, um comportamento especial pode ser disparado. Esse comportamento só ocorrerá se uma operação JetEscrowUpdate fizer com que a coluna tenha um valor igual a zero. A ação não acontece imediatamente, mas ocorre em algum momento após a transação, o que fez com que a coluna tivesse um valor de zero commits. A coluna ainda deverá ter um valor igual a zero (ou seja, se nenhuma outra sessão tiver modificado a coluna). Se a coluna tiver sido criada com JET_bitColumnDeleteOnZero, o registro que contém a coluna será excluído. Se a coluna tiver sido criada com JET_bitColumnFinalize, um retorno de chamada será emitido. Uma falha pode fazer com que essas ações não ocorram, mas a manutenção online (usando a função JetDefragment ) refazerá corretamente as ações.
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_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetBeginTransaction
JetDefragment
JetPrepareUpdate
JetRetrieveColumn
JetRollback
JetStopService
JetUpdate