Condividi tramite


Controllo delle transazioni (Motore di database)

Nelle applicazioni le transazioni vengono controllate principalmente specificandone l'inizio e la fine. Per specificare tali informazioni, è possibile utilizzare le istruzioni Transact-SQL o le funzioni API. Il sistema deve essere in grado di gestire correttamente gli errori che comportano l'interruzione di una transazione prima che questa venga completata.

Per impostazione predefinita, le transazioni vengono gestite a livello della connessione. Quando viene avviata una transazione su una connessione, tutte le istruzioni Transact-SQL eseguite su tale connessione fanno parte della transazione fino a quando questa non viene completata. Tuttavia, nell'ambito di una sessione MARS (Multiple Active Result Set) una transazione Transact-SQL esplicita o implicita diventa una transazione con ambito batch gestita a livello di batch. Una volta completato il batch, se per la transazione con ambito batch non viene eseguito il commit o il rollback, il rollback viene eseguito automaticamente da SQL Server.

Avvio di transazioni

Utilizzando le funzioni API e le istruzioni Transact-SQL è possibile avviare transazioni in un'istanza di Motore di database di SQL Server come transazioni esplicite, con autocommit o implicite. Nell'ambito di una sessione MARS le transazioni Transact-SQL esplicite e implicite diventano transazioni con ambito batch.

  • Transazioni esplicite
    Avviare esplicitamente una transazione tramite una funzione API o eseguendo l'istruzione Transact-SQL BEGIN TRANSACTION.

  • Transazioni con autocommit
    Modalità predefinita per Motore di database. Viene eseguito il commit di ogni singola istruzione Transact-SQL completata. Non è necessario specificare istruzioni per il controllo delle transazioni.

  • Transazioni implicite
    La modalità di esecuzione implicita delle transazioni viene impostata tramite una funzione API o l'istruzione Transact-SQL SET IMPLICIT_TRANSACTIONS ON. L'istruzione successiva avvia automaticamente una nuova transazione. Quando la transazione viene completata, l'istruzione Transact-SQL successiva avvia una nuova transazione.

  • Transazioni con ambito batch
    Applicabile solo a MARS, una transazione Transact-SQL esplicita o implicita che inizi nell'ambito di una sessione MARS diventa una transazione con ambito batch. Per una transazione con ambito batch di cui venga eseguito il commit o il rollback al completamento di un batch viene eseguito automaticamente il rollback da SQL Server.

Le modalità di transazione vengono gestite a livello della connessione. Se in una connessione viene modificata la modalità transazione, la modalità delle altre connessioni rimane invariata.

Interruzione di transazioni

Per interrompere una transazione, è possibile utilizzare l'istruzione COMMIT o ROLLBACK oppure una funzione API.

  • COMMIT
    Se una transazione viene completata correttamente, è necessario eseguirne il commit. L'istruzione COMMIT consente di integrare in modo permanente nel database tutte le modifiche apportate dalla transazione. L'istruzione consente inoltre di liberare le risorse, ad esempio i blocchi, utilizzate dalla transazione.

  • ROLLBACK
    Se in una transazione si verifica un errore oppure l'utente decide di annullare la transazione, è necessario eseguirne il rollback. L'istruzione ROLLBACK consente di annullare tutte le modifiche apportate ai dati ripristinandone lo stato corrente all'inizio della transazione. L'istruzione consente inoltre di liberare le risorse utilizzate dalla transazione.

Nota

Nelle connessioni abilitate per supportare più MARS, non è possibile eseguire il commit di una transazione avviata tramite una funzione API mentre vi sono richieste di esecuzione in sospeso. Qualsiasi tentativo di eseguire il commit di questo tipo di transazione durante l'esecuzione di operazioni in sospeso restituisce un errore.

Indicazione dei limiti delle transazioni

Per identificare l'inizio e la fine di una transazione di Motore di database, è possibile utilizzare le istruzioni Transact-SQL oppure le funzioni e i metodi API.

  • Istruzioni Transact-SQL
    Le istruzioni BEGIN TRANSACTION, COMMIT TRANSACTION, COMMIT WORK, ROLLBACK TRANSACTION, ROLLBACK WORK e SET IMPLICIT_TRANSACTIONS consentono di definire l'inizio e la fine delle transazioni. Tali istruzioni vengono utilizzate principalmente nelle applicazioni DB-Library e negli script Transact-SQL, ad esempio gli script eseguiti con l'utilità da riga di comando osql.

  • Funzioni e metodi API
    Le API del database, ad esempio ODBC, OLE DB e ADO, e lo spazio dei nomi SQLClient di .NET Framework includono funzioni o metodi utilizzati per delimitare le transazioni. Tali funzioni e metodi rappresentano i principali meccanismi di controllo delle transazioni nelle applicazioni Motore di database.

Ogni transazione deve essere gestita tramite uno di questi due metodi. L'utilizzo di entrambi i metodi sulla stessa transazione può provocare risultati imprevisti. Non è consigliabile, ad esempio, avviare una transazione tramite le funzioni API ODBC e quindi completarla eseguendo l'istruzione Transact-SQL COMMIT. Al driver ODBC SQL Server non verrebbe inviata alcuna notifica del commit della transazione. In questo caso, la transazione deve essere completata tramite la funzione ODBC SQLEndTran.

Errori durante l'elaborazione delle transazioni

Se una transazione non viene eseguita correttamente a causa di un errore grave, in SQL Server ne viene eseguito automaticamente il rollback e tutte le risorse utilizzate dalla transazione vengono liberate. Se viene interrotta la connessione di rete tra il client e Motore di database, quando la rete notifica l'istanza dell'interruzione viene eseguito il rollback delle transazioni in sospeso per tale connessione. La connessione viene interrotta anche se si verifica un errore nell'applicazione client oppure se il computer client viene spento o riavviato. Anche in questi casi, dopo la notifica dell'interruzione, nell'istanza di Motore di database viene eseguito il rollback delle transazioni in sospeso. Questa operazione viene eseguita anche se l'applicazione client viene disconnessa.

Se in un batch si verifica un errore di runtime in un'istruzione, ad esempio la violazione di un vincolo, per impostazione predefinita in Motore di database viene eseguito solo il rollback dell'istruzione che ha generato l'errore. Per modificare questa impostazione, è possibile utilizzare l'istruzione SET XACT_ABORT. In seguito all'esecuzione di questa istruzione, qualsiasi errore di runtime di un'istruzione comporta il rollback automatico della transazione corrente. L'opzione SET XACT_ABORT non ha alcun effetto sugli errori di compilazione, quali gli errori di sintassi. Per ulteriori informazioni, vedere SET XACT_ABORT (Transact-SQL).

Quando si verificano errori, è necessario includere un intervento di correzione (COMMIT o ROLLBACK) nel codice dell'applicazione. Uno strumento efficace per la gestione degli errori, inclusi quelli nelle transazioni, è rappresentato dal costrutto Transact-SQL TRY…CATCH. Per ulteriori informazioni ed esempi con transazioni, vedere Utilizzo di TRY...CATCH in Transact-SQL e TRY...CATCH (Transact-SQL).