Punti di salvataggio delle transazioni
I punti di salvataggio offrono un meccanismo per l'esecuzione del rollback di parti delle transazioni. Per creare un punto di salvataggio, è necessario utilizzare l'istruzione SAVE TRANSACTION savepoint_name. È quindi necessario eseguire un'istruzione ROLLBACK TRANSACTION savepoint_name per eseguire il rollback del punto di salvataggio invece del rollback all'avvio della transazione.
I punti di salvataggio sono utili nelle situazioni in cui la possibilità di errore è molto ridotta. L'utilizzo di un punto di salvataggio per eseguire il rollback di una parte di una transazione quando si verifica un errore poco frequente può risultare più efficace rispetto alla verifica preliminare della validità di un aggiornamento in ogni transazione. Poiché l'aggiornamento e il rollback sono operazioni onerose, l'utilizzo di punti di salvataggio è efficace solo se la probabilità di errore è molto ridotta e la verifica preliminare della validità di un aggiornamento comporta un costo elevato.
Nell'esempio seguente viene illustrato l'utilizzo di un punto di salvataggio in un sistema di gestione degli ordini in cui la probabilità che un prodotto sia esaurito è molto ridotta, in quanto la società si avvale di fornitori e livelli di riordino efficienti. Prima di eseguire gli aggiornamenti necessari per la registrazione di un ordine, in un'applicazione viene in genere verificato se la quantità di scorte disponibili è sufficiente. Nell'esempio seguente si presuppone che, per qualche motivo, la verifica preliminare della quantità di scorte disponibili rappresenti un'operazione relativamente onerosa, a causa di una connessione tramite un modem lento o una rete WAN. È possibile scrivere il codice dell'applicazione in modo che venga eseguito solo l'aggiornamento e, in caso di errore dovuto a una disponibilità di scorte insufficiente, il rollback dell'aggiornamento. In questo caso, risulta più veloce eseguire una verifica del valore di @@ERROR in seguito all'inserimento anziché verificare la disponibilità delle scorte prima dell'aggiornamento.
Nella tabella InvCtrl è incluso un vincolo CHECK che genera l'errore 547 se il valore della colonna QtyInStk è minore di 0. La procedura OrderStock crea un punto di salvataggio. Se si verifica l'errore 547, viene eseguito il rollback fino al punto di salvataggio e viene restituito il numero di articoli disponibili al processo chiamante, che può quindi sostituire l'ordine con la quantità disponibile. Se OrderStock restituisce 0, significa che la disponibilità di scorte è sufficiente per soddisfare l'ordine.
SET NOCOUNT OFF;
GO
USE AdventureWorks;
GO
CREATE TABLE InvCtrl
(WhrhousID int,
PartNmbr int,
QtyInStk int,
ReordrPt int,
CONSTRAINT InvPK PRIMARY KEY
(WhrhousID, PartNmbr),
CONSTRAINT QtyStkCheck CHECK (QtyInStk > 0) );
GO
CREATE PROCEDURE OrderStock
@WhrhousID int,
@PartNmbr int,
@OrderQty int
AS
DECLARE @ErrorVar int;
SAVE TRANSACTION StkOrdTrn;
UPDATE InvCtrl SET QtyInStk = QtyInStk - @OrderQty
WHERE WhrhousID = @WhrhousID
AND PartNmbr = @PartNmbr;
SELECT @ErrorVar = @@error;
IF (@ErrorVar = 547)
BEGIN
ROLLBACK TRANSACTION StkOrdTrn;
RETURN (SELECT QtyInStk
FROM InvCtrl
WHERE WhrhousID = @WhrhousID
AND PartNmbr = @PartNmbr);
END
ELSE
RETURN 0;
GO