Rollback Transaction in Sql Server

Rollback Transaction in Sql Server 2019 tramite query.

Come eseguire un Rollback Transaction in Sql Server?

Le transazioni in SQL Server vengono utilizzate per eseguire un set di query in un gruppo. Con le transazioni, tutte le istruzioni in un gruppo vengono eseguite o nessuna delle istruzioni viene eseguita.

Nel caso in cui una delle query in un gruppo di query eseguite da una transazione ha esito negativo, viene eseguito il rollback di tutte le query eseguite in precedenza.

Il rollback Transaction in SQL Server viene eseguito automaticamente. Tuttavia, è possibile eseguire manualmente il rollback di una transazione in base a determinate condizioni.

Vediamo cos’è una transazione e come può essere eseguito il Rollback Transaction in Sql Server sia manualmente che automaticamente.

Creare un database fittizio

In primo luogo, creiamo un database con un set di dati fittizio su cui esercitarsi, almeno che tu non abbia già un db restorato nella sui istanza Sql.

CREATE Database BookStore;
GO
USE BookStore;
CREATE TABLE Books
(
id INT,
name VARCHAR(50) NOT NULL,
category VARCHAR(50) NOT NULL,
price INT NOT NULL
)

Ora aggiungiamo alcuni record fittizi nella tabella:

USE BookStore
 
INSERT INTO Books
 
VALUES
(1, 'Book1', 'Cat1', 1800),
(2, 'Book2', 'Cat2', 1500),
(3, 'Book3', 'Cat3', 2000),
(4, 'Book4', 'Cat4', 1300),
(5, 'Book5', 'Cat5', 1500),
(6, 'Book6', 'Cat6', 5000),
(7, 'Book7', 'Cat7', 8000),
(8, 'Book8', 'Cat8', 5000),
(9, 'Book9', 'Cat9', 5400),
(10, 'Book10', 'Cat10', 3200)

Lo script aggiunge 10 record fittizi nella tabella Books.

Esecuzione di più query senza utilizzare transazioni

Ora vediamo i problemi che si verificano se eseguiamo più query in un gruppo senza transazioni.

Vedremo anche, come le transazioni possono essere utilizzate per eseguire automaticamente e manualmente il rollback delle query SQL e gestire questi problemi.

Esaminare lo script seguente:

INSERT INTO Books 
VALUES (15, 'Book15', 'Cat5', 2000)
UPDATE Books
SET price = '25 Hundred' WHERE id = 15
DELETE from Books
WHERE id = 15

Nello script precedente vengono eseguite tre query.

La prima query inserisce un nuovo record nella tabella Book in cui l’ID del record è 15.

La seconda query aggiorna il prezzo del libro con id 15.

Infine, la terza query elimina il record con ID 15.

Se si esegue la query precedente, verrà visualizzato il seguente errore:

Rollback Transaction in Sql Server- Errore Query
Rollback Transaction in Sql Server- Errore Query

L’errore dato in output è abbastanza semplice da capire. Dice che non è possibile inserire un valore Varchar in un record definito Integer.

Di conseguenza, la seconda query non viene eseguita. Tuttavia, il problema con lo script precedente è che mentre la seconda query ha esito negativo, la prima query viene comunque eseguita.

È possibile verificarlo selezionando tutti i record dalla tabella Book, come illustrato di seguito:

Rollback Transaction in Sql Server- Esempio Tabella
Rollback Transaction in Sql Server- Esempio Tabella

Se si vuole tornare allo stato precedente è necessario utilizzare le transazioni in modo che venga eseguito il rollback transaction in automatico.

Rollback Transaction automatico in Sql Server

Come ho detto in precedenza, se una delle query in un gruppo di query eseguite all’interno di una transazione ha esito negativo, viene eseguito il rollback di tutte le istruzioni SQL eseguite in precedenza. Vediamo come le transazioni possono essere utilizzate per eseguire il rollback:

BEGIN TRANSACTION
 
  INSERT INTO Books 
  VALUES (20, 'Book15', 'Cat5', 2000)
 
  UPDATE Books
  SET price = '25 Hundred' WHERE id = 20
 
  DELETE from Books
  WHERE id = 20
 
COMMIT TRANSACTION

Per avviare una transazione, viene utilizzata l’istruzione BEGIN TRANSACTION, seguita dal set di query che si desidera eseguire all’interno della transazione.

Per contrassegnare la fine di una transazione, è possibile utilizzare l’istruzione COMMIT TRANSACTION.

Nello script precedente vengono eseguite le stesse tre query SQL. Tuttavia, questa volta le query sono state eseguite all’interno di una transazione.

Anche in questo caso, la prima query verrà eseguita correttamente e si verificherà un errore durante l’esecuzione della seconda query.

Poiché le query vengono eseguite all’interno di una transazione, l’errore della seconda query causerà il rollback di tutte le query eseguite in precedenza.

A questo punto, se si selezionano tutti i record dalla tabella Libri, il nuovo record con ID 20 non verrà visualizzato, inserito dalla prima query all’interno della transazione.

Rollback Transaction manuale in Sql Server

Nella sezione precedente è stato illustrato come eseguire automaticamente il rollback transaction in Sql Server se una delle query non può essere eseguita correttamente.

Tuttavia, è possibile eseguire il rollback di una query anche in base a determinate condizioni. Ad esempio, è possibile eseguire il rollback transaction che inserisce un record nella tabella books se esiste già un libro con lo stesso nome.

DECLARE @BookCount int
 
BEGIN TRANSACTION AddBook
 
  INSERT INTO Books
  VALUES (20, 'Book15', 'Cat5', 2000)
 
  SELECT @BookCount = COUNT(*) FROM Books WHERE name = 'Book15'
 
  IF @BookCount >= 1
    BEGIN 
      ROLLBACK TRANSACTION AddBook
      PRINT 'A book with the same name already exists'
    END
  ELSE
    BEGIN
      COMMIT TRANSACTION AddBook
      PRINT 'New book added successfully'
    END

Nello script precedente, dichiariamo una variabile @BookCount. Successivamente, viene creata una transazione denominata AddBook. Per creare una transazione denominata, è sufficiente passare qualsiasi nome di stringa per la transazione dopo l’istruzione BEGIN TRANSACTION.

All’interno della transazione, un libro con id 20 e nome Book15 viene inserito nella tabella Libri. Successivamente, la funzione CONTA.

Se il conteggio è maggiore di 1, significa che esiste già un libro con il nome Book15. In questo caso, l’istruzione SQL di rollback viene utilizzata per eseguire manualmente il rollback della transazione AddBook. in caso contrario, verrà eseguito il commit della transazione e verrà visualizzato un messaggio appropriato al lettore.

Si può vedere che la sintassi dell’istruzione SQL di rollback è semplice. È sufficiente scrivere l’istruzione ROLLBACK TRANSACTION, seguita dal nome della transazione di cui si desidera eseguire il rollback.

A questo punto, provare a eseguire la transazione AddBook per inserire il record in cui il nome è Book15 (assicurarsi che non esista già alcun libro con questo nome nella tabella Book).

Si vedrà che la transazione verrà eseguita correttamente.

A questo punto, provare a ri-eseguire la transazione AddBook. Si vedrà che questa volta la transazione avrà esito negativo poiché un libro con il nome Book15 esiste già nel database. Pertanto verrà eseguito il rollback transaction.

Conclusione

Abbiamo visto come eseguire il Rollback Transaction in Sql Server utilizzando le transazioni.

È possibile eseguire automaticamente o manualmente il rollback delle query tramite transazioni.

Il rollback automatico si verifica quando una query non viene eseguita per qualsiasi motivo. Il rollback manuale viene eseguito in base alle condizioni definite dall’utente.

Vedi di più

Rollback Transaction in Sql Server

ApexSQL è uno strumento completo che include funzionalità come frammenti di codice, sostituzioni automatica SQL, navigazione tramite schede, query salvate e altro ancora per SSMS e Visual Studio

Autore Bartolomeo

Consulente tecnico con la passione per il web e la tecnologia e tutto quello che le ronza intorno.
Nel tempo libero scrivo articoli per il mio blog su argomenti vari, in particolare su configurazione Windows, Linux e WordPress.

Condividi questo articolo!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ho letto la policy privacy e accetto il trattamento dei miei dati personali in conformità al D.Lgs. 196/2003