Transazioni (eventi di Windows)

Si applica a: Windows | server Windows

Transazioni

Le transazioni ESE sono unità logiche di elaborazione che controllano il modo in cui un'applicazione vede e modifica le righe nel database. L'applicazione può usare i punti di salvataggio delle transazioni per determinare se mantenere o eliminare un determinato set di modifiche al database. Tutte le transazioni in ESE sono atomiche, coerenti, isolate e durevoli (ACID), come descritto di seguito:

  • Atomica: Tutti gli aggiornamenti nella transazione vengono visualizzati nel database o vengono eliminati.
  • Coerente: Il database inizierà sempre in uno stato legale e terminerà sempre in un altro stato legale. Per le applicazioni ESE, il motore di database controlla alcuni vincoli semplici, ad esempio l'univocità di un indice univoco, ma l'applicazione stessa definirà quasi tutti gli altri aspetti di ciò che significa che il database sia in uno stato legale.
  • Isolamento: Le transazioni sono isolate dagli aggiornamenti da altre sessioni. Una transazione non visualizzerà mai un set parziale di modifiche apportate da un'altra transazione.
  • Durevole: Dopo che il motore di database riconosce che è stato eseguito il commit di una transazione, le modifiche sono persistenti nel database. La durabilità di una transazione può essere facoltativamente annullata per motivi di prestazioni.

Le transazioni vengono eseguite entro i limiti delle chiamate a JetBeginTransaction e JetCommitTransaction o JetRollback. Quando l'applicazione entra nella transazione, il database viene bloccato nell'istanza nel momento in cui inizia la transazione. Questa operazione è denominata isolamento dello snapshot. Se la transazione viene terminata chiamando JetRollback, nessuna delle operazioni eseguite nella transazione viene sottoposta a commit nel database. Se il processo o il computer si arresta in modo anomalo prima della chiamata a JetCommitTransaction , equivale a chiamare JetRollback.

Questa procedura illustra come avviare ed eseguire il commit di una transazione che legge e aggiorna i dati in un database.

Per avviare ed eseguire il commit di una transazione

  1. Chiamare JetBeginTransaction o JetBeginTransaction2 con l'ID sessione per avviare la transazione.

  2. Spostare il cursore nel record desiderato chiamando JetMove con JET_MoveFirst specificato nel parametro cRow . Per altre informazioni su come spostare il cursore, vedere indicizzazione nell'argomento Tabella .

  3. Chiamare JetGetTableColumnInfo sul record corrente con JET_ColInfo specificato nel parametro InfoLevel per recuperare l'ID colonna per la colonna. L'ID colonna viene restituito nella struttura JET_COLUMNDEF .

  4. Chiamare JetSetColumn con l'ID sessione, l'ID tabella e l'ID colonna della colonna aggiornata. I dati della colonna sono contenuti nel parametro pvData .

  5. Chiamare JetCommitTransaction per eseguire il commit della transazione nel database.

Il modo in cui un motore di database ESE implementa l'isolamento dello snapshot presenta alcune differenze importanti rispetto ai modelli tradizionali di isolamento e blocco del database relazionale. Quando una transazione legge una riga, può sempre accedere alla riga senza errori o attendere che altre sessioni rilascino un blocco. Quando una transazione tenta di aggiornare una riga, avrà esito positivo se è la prima sessione per aggiornare tale riga, ovvero il primo writer vince. Se la sessione non è il primo writer, l'operazione avrà esito negativo immediatamente con un errore di conflitto di scrittura. La sessione deve quindi interrompere la transazione, attendere (in genere tramite un ritardo casuale), affinché l'altra transazione esecuzione delle modifiche e quindi ritentare la transazione. Il motore di database non causerà automaticamente l'attesa della sessione fino al completamento dell'aggiornamento dell'altra transazione. In genere, una transazione verificherà se può aggiornare una riga all'interno della chiamata JetUpdate . Se non riesce a bloccare la riga per l'aggiornamento, JetUpdate avrà esito negativo con JET_errWriteConflict.

Le sessioni sono limitate a un thread dal momento in cui la transazione inizia alla fine della transazione. È consigliabile eseguire tutte le operazioni di aggiornamento e recupero in una transazione. ESE supporta anche modifiche dello schema, ad esempio la creazione di tabelle e l'aggiunta di colonne all'interno della transazione. Le modifiche di aggiornamento e schema possono essere eseguite nella stessa transazione. Al termine della transazione con JetCommitTransaction, l'aggiornamento viene registrato nel file di log delle transazioni. Questi file possono essere usati per mantenere uno stato coerente in modo logico in caso di chiusura imprevista del processo o arresto del sistema.

Le transazioni possono essere annidate fino a 7 livelli con chiamate corrispondenti a JetBeginTransaction e JetCommitTransaction o JetRollback annidate tra loro. In questo modo l'applicazione può eseguire il rollback di una parte della transazione senza dover eseguire il backup dell'intera transazione. La chiamata annidata a JetCommitTransaction indica che questo livello di elaborazione è stato completato; Tuttavia, la transazione non viene sottoposta a commit nel database fino alla chiamata più esterna per eseguire il commit della transazione con JetCommitTransaction.

Le colonne di aggiornamento del deposito possono essere aggiornate simultaneamente da più sessioni senza errori con Jet_errWriteConflict. La funzione JetEscrowUpdate può essere chiamata solo in colonne di deposito, colonne create con Jet_bitColumnEscrowUpdate.