Funzione JetBeginTransaction

Si applica a: Windows | Windows Server

Funzione JetBeginTransaction

La funzione JetBeginTransaction causa l'immissione di una sessione e la creazione di un nuovo punto di salvataggio. Questa funzione può essere chiamata più volte in una singola sessione per causare la creazione di punti di salvataggio aggiuntivi. Questi punti di salvataggio possono essere usati per mantenere o ignorare in modo selettivo le modifiche allo stato del database.

    JET_ERR JET_API JetBeginTransaction(
      __in          JET_SESID sesid
    );

Parametri

sesid

Sessione da usare per questa chiamata.

Valore restituito

Questa funzione restituisce il tipo di dati JET_ERR con uno dei codici restituiti seguenti. Per altre informazioni sugli errori ESE possibili, vedere Errori del motore di archiviazione estendibili e parametri di gestione degli errori.

Codice restituito

Descrizione

JET_errSuccess

Operazione riuscita.

JET_errClientRequestToStopJetService

Non è possibile completare l'operazione perché tutte le attività nell'istanza associata alla sessione non sono state interrotte in seguito a una chiamata a JetStopService.

JET_errInstanceUnavailable

Non è possibile completare l'operazione perché l'istanza associata alla sessione ha rilevato un errore irreversibile che richiede che l'accesso a tutti i dati venga revocato per proteggere l'integrità dei dati.

Questo errore verrà restituito solo da Windows XP e versioni successive.

JET_errNotInitialized

Non è possibile completare l'operazione perché l'istanza associata alla sessione non è ancora stata inizializzata.

JET_errRestoreInProgress

Non è possibile completare l'operazione perché un'operazione di ripristino è in corso nell'istanza associata alla sessione.

JET_errSessionSharingViolation

La stessa sessione non può essere usata contemporaneamente per 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_errTransTooDeep

Impossibile avviare una nuova transazione perché la sessione è già in corrispondenza della profondità massima del punto di salvataggio consentita dal motore di database.

In caso di esito positivo, la sessione specificata sarà all'interno di una transazione. Se la sessione era precedentemente all'interno di una transazione, verrà creato un nuovo punto di salvataggio.

In caso di errore, lo stato transazionale della sessione rimarrà invariato. Non verrà eseguita alcuna modifica allo stato del database.

Commenti

Il motore di database fornisce un modello di isolamento snapshot per le relative transazioni. Ciò significa che, quando una sessione entra prima in uno stato transazionale, la sessione visualizzerà l'intero database bloccato in tempo all'inizio della transazione. Una sessione non deve leggere i dati perché può sempre accedere alla versione appropriata di tali dati. Ciò significa che una sessione che sta aggiornando i dati non impedisce mai a una sessione diversa di leggere tali dati.

Un'altra implicazione dell'uso dell'isolamento dello snapshot è il modello di blocco usato per gli aggiornamenti. Il motore di database assegna un blocco di scrittura a una determinata parte di dati alla prima sessione che la richiede. Questo blocco di scrittura viene rilasciato quando la transazione viene commit o interrotta completamente in modo che la sessione non sia più in una transazione. Mentre una sessione contiene un blocco di scrittura, qualsiasi altra sessione che richiede lo stesso blocco di scrittura non blocca fino a quando non è disponibile il blocco di scrittura. Invece, la seconda sessione avrà esito negativo immediatamente con JET_errWriteConflict. Per risolvere questo conflitto, la seconda sessione deve interrompere completamente la transazione (o eseguire il commit), attendere un piccolo periodo di tempo per la prima sessione per eseguire il commit o interrompere la transazione e quindi ricominciare tutto.

In supporto dell'isolamento dello snapshot, il motore di database archivia tutte le versioni di tutti i dati modificati in memoria dal momento in cui è stata avviata la transazione attiva meno recente in qualsiasi sessione. Ciò ha implicazioni importanti per l'applicazione. Qualsiasi comportamento che causa la compilazione di un numero elevato di versioni in memoria può causare l'esaurimento delle dimensioni massime dell'archivio delle versioni (vedere JET_paramMaxVerPages nei parametri di sistema per altre informazioni). Questo comportamento include, ma non è limitato agli aggiornamenti molto grandi in una singola transazione e transazioni a esecuzione molto prolungata. Di conseguenza, è molto importante configurare correttamente le dimensioni dell'archivio versioni per il carico transazionale previsto dell'applicazione. È anche importante prestare grande attenzione al numero di aggiornamenti eseguiti in una singola transazione. Inoltre, è importante rendere le transazioni il più breve possibile in scenari di carico elevati.

È consigliabile che l'applicazione sia sempre nel contesto di una transazione quando si chiamano API ESE che recuperano o aggiornano i dati. In caso contrario, il motore di database esegue automaticamente il wrapping di ogni chiamata API ESE di questo tipo in una transazione per conto dell'applicazione. Il costo di queste transazioni molto brevi può essere aggiunto rapidamente in alcuni casi.

Il comportamento predefinito del motore consiste nel limitare l'uso di una sessione allo stesso thread dalla prima chiamata a JetBeginTransaction fino al momento in cui viene effettuata la chiamata corrispondente a JetCommitTransaction o JetRollback . Questo comportamento può essere modificato per rimuovere questa restrizione impostando un contesto di sessione personalizzato usando JetSetSessionContext e JetResetSessionContext.

Il motore di database supporta anche le modifiche dello schema transazionali. Ad esempio, è possibile avviare una nuova transazione, creare una tabella, aggiungere alcune colonne, creare un indice o due e quindi interrompere la transazione. Gli elementi dello schema appena aggiunti verranno rimossi dal database. È anche possibile combinare le modifiche dello schema e gli aggiornamenti ordinari del database nella stessa transazione.

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_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
Parametri di sistema