Nesting Transactions
Jawne transakcje można zagnieżdżać.To jest przeznaczone głównie do obsługi transakcji w procedurach przechowywanych, które mogą być wywoływane z procesu już w transakcji lub procesy, które mają nie aktywnej transakcji.
W poniższym przykładzie pokazano sposób użycia planowanych transakcji zagnieżdżonych.Procedura TransProc Wymusza jego transakcji, niezależnie od trybu transakcji każdy proces, który wykonuje je. Jeśli TransProc jest wywoływane, gdy trans akcja jest aktywny, zagnieżdżone trans akcja w TransProc przeważnie jest ignorowany i jego instrukcji INSERT są zatwierdzone lub jej wstecz oparty na ostatni akcja do trans zewnętrzne akcja. Jeśli TransProc jest wykonywana przez proces, który nie ma zaległych transakcję przekazywać transakcję po zakończeniu procedury skutecznie zatwierdza instrukcji INSERT.
SET QUOTED_IDENTIFIER OFF;
GO
SET NOCOUNT OFF;
GO
USE AdventureWorks;
GO
CREATE TABLE TestTrans(Cola INT PRIMARY KEY,
Colb CHAR(3) NOT NULL);
GO
CREATE PROCEDURE TransProc @PriKey INT, @CharCol CHAR(3) AS
BEGIN TRANSACTION InProc
INSERT INTO TestTrans VALUES (@PriKey, @CharCol)
INSERT INTO TestTrans VALUES (@PriKey + 1, @CharCol)
COMMIT TRANSACTION InProc;
GO
/* Start a transaction and execute TransProc. */
BEGIN TRANSACTION OutOfProc;
GO
EXEC TransProc 1, 'aaa';
GO
/* Roll back the outer transaction, this will
roll back TransProc's nested transaction. */
ROLLBACK TRANSACTION OutOfProc;
GO
EXECUTE TransProc 3,'bbb';
GO
/* The following SELECT statement shows only rows 3 and 4 are
still in the table. This indicates that the commit
of the inner transaction from the first EXECUTE statement of
TransProc was overridden by the subsequent rollback. */
SELECT * FROM TestTrans;
GO
Zatwierdzanie transakcji wewnętrznych jest ignorowany przez SQL Server Database Engine. Transakcja jest zatwierdzona lub jej wycofania, opartych na działaniach podejmowanych po zakończeniu transakcji peryferyjnych.Dba transakcji zewnętrznych wewnętrznej transakcji zagnieżdżonych są także zadeklarowana.Jeżeli zostanie przywrócona transakcji zewnętrznych, następnie wszystkie transakcje wewnętrzne są również przywracane, niezależnie od tego, niezależnie od tego, czy zostały indywidualnie zatwierdzone transakcje wewnętrzne.
Każde wywołanie przekazywać transakcję lub praca zatwierdzanie odnosi się do ostatnio wykonane instrukcji BEGIN TRANSACTION.Jeśli instrukcji BEGIN TRANSACTION są zagnieżdżone, to instrukcja zatwierdzanie stosowany tylko do ostatniej transakcji zagnieżdżonych jest najbardziej transakcji.Nawet wtedy, gdy przekazywać transakcję transaction_name Instrukcja w obrębie transakcji zagnieżdżonych odnosi się do nazwy transakcji dla transakcji zewnętrznych, zatwierdzanie dotyczy tylko transakcji znajdujące się najniżej.
It is not legal for the transaction_name parameter of a ROLLBACK TRANSACTION statement to refer to the inner transactions of a set of named nested transactions.transaction_name can refer only to the transaction name of the outermost transaction.Jeśli ROLLBACK TRANSACTION transaction_name Instrukcja przy użyciu nazwy zewnętrznego transakcji jest wykonywane na dowolnym poziom zestawu transakcji zagnieżdżonych, wszystkie transakcje zagnieżdżone są przywracane. Jeśli instrukcja ROLLBACK pracy lub ROLLBACK TRANSACTION, bez transaction_name parametr jest wykonywane na dowolnym poziomie zbiór transakcji zagnieżdżonych, toczy się ona wszystkich transakcji zagnieżdżonych, łącznie z peryferyjnych transakcji.
Funkcja @@ TRANCOUNT zapisuje bieżący poziom zagnieżdżenia transakcji.Każda instrukcja instrukcji BEGIN TRANSACTION dzieli @@ TRANCOUNT jeden.Każdy zatwierdzanie TRANSACTION lub praca zatwierdzanie instrukcja zmniejsza @@ TRANCOUNT o jeden.ROLLBACK utworu lub instrukcja ROLLBACK TRANSACTION, który nie ma nazwy transakcji powoduje powrót wszystkich zagnieżdżonych transakcji i zmniejsza @@ TRANCOUNT na 0.TRANSAKCJĘ ROLLBACK, nazwę transakcji peryferyjnych transakcji zestaw transakcji zagnieżdżonych w rolkach wszystkie zagnieżdżonych transakcji i zmniejsza @@ TRANCOUNT z powrotem na 0.Gdy wiadomo, jeśli znajdujesz się już w transakcji, SELECT @@ TRANCOUNT można określić, czy jest co najmniej 1.@@ TRANCOUNT wynosi 0, nie są w transakcji.