Udostępnij za pośrednictwem


Zagnieżdżanie transakcji

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ą aktywnych transakcji.

Poniższy przykład pokazuje przeznaczenie transakcji zagnieżdżonych.Procedura TransProc wymusza jej transakcji, niezależnie od trybu transakcji każdy proces, który wykonuje goJeśli TransProc jest wywoływane, gdy transakcja jest aktywne, transakcji zagnieżdżonych w TransProc jest w dużej mierze ignorowane, a jego instrukcji INSERT są zatwierdzone lub walcowane wstecz oparty na ostateczne akcja podejmowane dla transakcji zewnętrznych.Jeśli TransProc jest wykonywany przez proces, który nie ma oczekujących transakcji, skutecznie zatwierdzeniu transakcji ZATWIERDZIĆ na końcu procedury instrukcji INSERT.

SET QUOTED_IDENTIFIER OFF;
GO
SET NOCOUNT OFF;
GO
USE AdventureWorks2008R2;
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

Przetwarzanie transakcji wewnętrznych jest ignorowany przez Aparat baz danych programu SQL Server.Transakcja jest przekazana lub wycofana oparte na akcja podjęte na końcu peryferyjnych transakcji.Zewnętrzne transakcja została zatwierdzona, wewnętrznej transakcji zagnieżdżonych są również zadeklarowanej.Jeżeli zostanie przywrócona transakcji zewnętrznych, następnie wszystkie transakcje wewnętrzne są również przywracane, niezależnie od tego, czy wewnętrzne transakcje zostały zatwierdzone, indywidualnie.

Każde wywołanie ZATWIERDZIĆ transakcji lub ZATWIERDZIĆ pracy stosuje się do ostatniej wykonanej instrukcji BEGIN TRANSACTION.Jeśli są zagnieżdżone instrukcje instrukcji BEGIN TRANSACTION, instrukcja COMMIT stosowany tylko do ostatniej transakcji zagnieżdżonych jest najbardziej transakcji.Nawet jeśli zatwierdzanie zatwierdzanie transaction_name instrukcja w obrębie zatwierdzanie zagnieżdżonych odnosi się do nazwa zatwierdzanie zatwierdzanie zewnętrznych, zatwierdzanie dotyczy tylko zatwierdzanie wewnętrzne.

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 TRANSAKCJĘ ROLLBACK transaction_name wykonaniu instrukcja przy użyciu nazwy transakcji zewnętrznych w dowolnym poziom zestaw transakcji zagnieżdżonych, wszystkich transakcji zagnieżdżonych walcowane Wstecz.Jeśli instrukcja WYCOFYWANIA pracy albo TRANSAKCJĘ ROLLBACK, bez transaction_name parametr jest wykonywane na dowolnym poziom zestaw zagnieżdżoną zrolowany wszystkich transakcji zagnieżdżonych, łącznie z peryferyjnego transakcji.

Funkcja @@ TRANCOUNT rekordy bieżącej transakcji poziom zagnieżdżenia.Każda instrukcja instrukcji BEGIN TRANSACTION zwiększa @@ TRANCOUNT o jeden.Każdego zatwierdzenia transakcji lub ZATWIERDZIĆ pracy instrukcja Dekrementuje @@ TRANCOUNT o jeden.Praca WYCOFYWANIA lub instrukcja TRANSAKCJĘ ROLLBACK, która nie ma nazwy transakcji wycofuje wszystkie transakcje zagnieżdżone i zmniejsza @@ TRANCOUNT 0.TRANSAKCJI ROLLBACK, która używa nazwy transakcji peryferyjnych transakcji w zestaw z rolki transakcji zagnieżdżonych kopii wszystkich zagnieżdżonych transakcji i zmniejsza @@ TRANCOUNT 0.Kiedy pewności, czy są już w transakcji zaznacz @@ TRANCOUNT w celu ustalenia, czy jest 1 lub więcej.Jeżeli @@ TRANCOUNT wynosi 0, nie jesteś w transakcji.