Funzione JetEscrowUpdate
Si applica a: Windows | Windows Server
Funzione JetEscrowUpdate
La funzione JetEscrowUpdate esegue un'operazione di addizione atomica su una colonna. Questa funzione consente a più sessioni di aggiornare contemporaneamente lo stesso record senza conflitti.
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
);
Parametri
sesid
Sessione da utilizzare per questa chiamata.
tableid
Cursore da utilizzare per questa chiamata.
columnid
Columnid della colonna da aggiornare.
Pv
Puntatore a un buffer contenente l'addend per la colonna.
cbMax
Dimensione del buffer contenente l'addend.
pvOld
Buffer di output che riceverà il valore corrente della colonna archiviato nel database (il controllo delle versioni viene ignorato).
cbOldMax
Dimensione massima del buffer di output che riceverà il valore corrente della colonna. Attualmente è supportato solo JET_coltypLong, pertanto il buffer deve avere una lunghezza di 4 byte o 0 byte. Se pvOld è NULL, cbOldMax deve essere 0.
pcbOldActual
Riceve la quantità effettiva di dati sui valori non elaborati ricevuti nel buffer di output.
grbit
Un gruppo di bit che specifica zero o più delle opzioni seguenti.
Valore |
Significato |
---|---|
JET_bitEscrowNoRollback |
Anche se la sessione che esegue l'aggiornamento del deposito ha il rollback della transazione, questo aggiornamento non verrà annullato. Si noti che poiché i record di log potrebbero non essere scaricati su disco, è possibile che gli aggiornamenti recenti del deposito eseguiti con questo flag vadano persi in caso di arresto anomalo. |
Valore restituito
Questa funzione restituisce il tipo di dati JET_ERR con uno dei codici restituiti seguenti. Per altre informazioni sui possibili errori ESE, vedere Errori del motore di archiviazione estendibile e parametri di gestione degli errori.
Codice restituito |
Descrizione |
---|---|
JET_errSuccess |
Operazione riuscita. |
JET_errAlreadyPrepared |
Il cursore ha un aggiornamento preparato con JetPrepareUpdate. |
JET_errClientRequestToStopJetService |
Non è possibile completare l'operazione perché tutte le attività sull'istanza associata alla sessione sono cessate a seguito di una chiamata a JetStopService. |
JET_errInstanceUnavailable |
Non è possibile completare l'operazione perché l'istanza associata alla sessione ha rilevato un errore irreversibile che richiede la revoca dell'accesso a tutti i dati per proteggere l'integrità dei dati. Questo errore verrà restituito solo da Windows XP e versioni successive. |
JET_errInvalidBufferSize |
È stata passata una dimensione del buffer non valida. Attualmente è supportato solo JET_coltypLong, pertanto il buffer deve essere di 4 byte. |
JET_errInvalidOperation |
È stata specificata una colonna non valida. La colonna deve essere creata con JET_bitColumnEscrowUpdate specificato. Solo le colonne fisse di JET_coltypLong possono essere specificate come aggiornabili. |
JET_errNoCurrentRecord |
Il cursore deve trovarsi in un record per aggiornare una colonna. |
JET_errNotInTransaction |
Gli aggiornamenti del deposito possono essere eseguiti solo da sessioni in una transazione. |
JET_errNotInitialized |
Non è possibile completare l'operazione perché l'istanza associata alla sessione non è ancora stata inizializzata. |
JET_errPermissionDenied |
Il cursore non può essere di sola lettura e aggiornare un record. |
JET_errRestoreInProgress |
Non è possibile completare l'operazione perché è in corso un'operazione di ripristino nell'istanza associata alla sessione. |
JET_errSessionSharingViolation |
La stessa sessione non può essere usata contemporaneamente da più thread. Questo errore verrà restituito solo da Windows XP e versioni successive. |
JET_errTermInProgress |
Non è possibile completare l'operazione perché l'istanza associata alla sessione viene arrestata. |
JET_errTransReadOnly |
La sessione deve disporre delle autorizzazioni di scrittura per aggiornare un record. |
JET_errWriteConflict |
Errore restituito quando viene richiesto un aggiornamento in conflitto. |
Commenti
In genere, se due sessioni tentano di aggiornare un record contemporaneamente, la seconda sessione riceverà un errore JET_errWriteConflict a meno che le sessioni non siano completamente serializzate. Per serializzare due sessioni che aggiornano lo stesso record, la seconda sessione deve avviare la transazione dopo che la prima transazione esegue il commit della transazione. Per altre informazioni, vedere JetBeginTransaction .
È possibile aggiornare più colonne nello stesso record. Gli aggiornamenti non influiscono l'uno sull'altro.
Solo le operazioni JetEscrowUpdate sono compatibili tra loro. Se due sessioni diverse tentano di preparare gli aggiornamenti o eliminare lo stesso record, verrà generato un conflitto di scrittura.
Sessione B |
||||
---|---|---|---|---|
JetEscrowUpdate |
JET_errSuccess |
JET_errWriteConflict |
JET_errWriteConflict |
|
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
||
Sessione A |
JET_errWriteConflict |
JET_errWriteConflict |
JET_errWriteConflict |
Le operazioni di deposito vengono con controllo delle versioni e vengono annullate usando JetRollback (a meno che non sia stato specificato JET_bitEscrowNoRollback). JetEscrowUpdate restituisce il valore non elaborato della colonna archiviata nel database, perché un'applicazione può voler eseguire un'azione speciale quando viene raggiunto un valore sentinel. JetRetrieveColumn restituisce la visualizzazione con versione corretta della colonna, ignorando gli aggiornamenti apportati dalle sessioni simultanee.
Dato due sessioni che operano sulla stessa colonna dello stesso record, è possibile vedere come funziona questa operazione. Si supponga che la colonna inizi con un valore pari a 0.
sessione |
Operazione |
Valore archiviato |
Valore restituito |
---|---|---|---|
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 |
La sostituzione di un record nella stessa transazione che esegue gli aggiornamenti di escrow a un record non è consigliabile. In particolare, se un aggiornamento in un record viene preparato con un JET_TABLEID e viene usato un JET_TABLEID diverso per completare l'aggiornamento del record, l'aggiornamento dell'escrow verrà perso quando viene chiamato JetUpdate . Ciò accade anche se la colonna di escrow non è stata impostata durante l'aggiornamento.
Quando una colonna aggiornabile escrow ha un valore pari a zero, è possibile attivare un comportamento speciale. Questo comportamento si verifica solo se un'operazione JetEscrowUpdate causa che la colonna abbia un valore pari a zero. L'azione non si verifica immediatamente, ma si verifica qualche volta dopo la transazione che ha causato che la colonna ha avuto un valore pari a zero commit. La colonna deve comunque avere un valore pari a zero, ovvero se non sono state modificate altre sessioni. Se la colonna è stata creata con JET_bitColumnDeleteOnZero, il record contenente la colonna verrà eliminato. Se la colonna è stata creata con JET_bitColumnFinalize, verrà rilasciato un callback. Un arresto anomalo può causare che queste azioni non si verifichino, ma la manutenzione online (usando la funzione JetDefragment ) ridistribuirà correttamente le azioni.
Requisiti
Requisito | Valore |
---|---|
Client |
Richiede Windows Vista, Windows XP o Windows 2000 Professional. |
Server |
Richiede Windows Server 2008, Windows Server 2003 o Windows 2000 Server. |
Intestazione |
Dichiarato in Esent.h. |
Libreria |
Usare ESENT.lib. |
DLL |
Richiede ESENT.dll. |
Vedere anche
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JetBeginTransaction
JetDefragment
JetPrepareUpdate
JetRetrieveColumn
JetRollback
JetStopService
JetUpdate