Descrivere le transazioni

Completato

Una transazione è una o più istruzioni T-SQL considerate come unità. Se una singola transazione ha esito negativo, tutte le istruzioni hanno esito negativo. Se una transazione ha esito positivo, si sa che tutte le istruzioni di modifica dei dati nella transazione sono state completate e sottoposte a commit nel database.

Le transazioni garantiscono che tutte le operazioni all'interno di una transazione abbiano esito positivo o falliscano completamente, senza consentire alcun completamento parziale. Le transazioni incapsulano operazioni che devono essere eseguite logicamente insieme, ad esempio più voci in tabelle correlate che fanno parte di una singola operazione.

Si consideri un'azienda che archivia gli acquisti in una tabella Sales.Order e i pagamenti in una tabella Sales.Payment . Quando un utente acquista qualcosa, entrambe le tabelle devono essere aggiornate. Se questa operazione viene implementata senza transazioni e si verifica un errore quando il pagamento viene scritto nel database, verrà comunque eseguito il commit dell'inserimento Sales.Order , lasciando la tabella di pagamento senza una voce.

Quando questa operazione viene implementata con le transazioni, vengono create entrambe le voci oppure nessuna delle due. Se si verifica un errore durante la scrittura del pagamento nella tabella, anche l'inserimento dell'ordine verrà annullato. Ciò significa che il database è sempre in uno stato coerente.

Diagramma che mostra la differenza tra l'uso di transazioni e il non uso di transazioni.

Si noti che questo si riferisce a gravi errori, ad esempio errori hardware o di rete. Gli errori nelle istruzioni SQL causano solo il rollback della transazione in determinate circostanze ed è importante esaminare le unità successive in questo modulo per comprendere appieno le implicazioni dell'uso delle transazioni.

Esistono diversi tipi di transazioni:

Transazioni esplicite

Le parole chiave BEGIN TRANSACTION e COMMIT o ROLLBACK iniziano e terminano ogni batch di istruzioni. In questo modo è possibile specificare le istruzioni di cui eseguire il commit o il rollback insieme.

Transazioni implicite

Una transazione viene avviata al termine della transazione precedente. Ogni transazione viene completata in modo esplicito con un'istruzione COMMIT o ROLLBACK.

Caratteristiche ACID

I sistemi OLTP (Online Transactional Processing) richiedono che le transazioni soddisfino le caratteristiche "ACID":

  • Atomicità: ogni transazione viene considerata come una singola unità, che ha esito positivo o negativo nella sua interezza. Ad esempio, una transazione che ha coinvolto l'addebito di fondi da un conto e il credito dello stesso importo a un altro conto deve completare entrambe le azioni. Se non è possibile completare un'azione, l'altra azione correlata deve avere esito negativo.
  • Coerenza: le transazioni possono solo spostare i dati del database da uno stato valido a un altro. Per continuare con l'esempio di debito e credito precedente, lo stato completato della transazione deve riflettere il trasferimento di fondi da un conto all'altro.
  • Isolamento: le transazioni simultanee non possono interferire tra loro e devono determinare uno stato di database coerente. Ad esempio, mentre la transazione per trasferire fondi da un conto a un altro è in-process, un'altra transazione che controlla il saldo di questi conti deve restituire risultati coerenti: la transazione di controllo del saldo non può recuperare un valore per un conto che riflette il saldo prima del trasferimento e un valore per l'altro conto che riflette il saldo dopo il trasferimento.
  • Durabilità: quando una transazione è stata sottoposta a commit, il commit rimane valido. Al termine della transazione di trasferimento del conto, i saldi del conto modificati vengono mantenuti, in questo modo che anche se il sistema di database dovesse essere disattivato, la transazione di commit verrà riflessa quando viene attivata di nuovo.