Aracılığıyla paylaş


Iç içe geçmiş hareketler

Açık hareketler iç içe kullanılabilir.Bu işlemde zaten bir işlem veya işlem etkin olan işlemler için çağrılabilir bir saklı yordamda işlemleri desteklemek üzere öncelikle hazırlanmıştır.

Aşağıdaki örnek, iç içe geçmiş işlem hedeflenen kullanımını göstermektedir.Yordamı TransProc Bunu çalıştırdığı herhangi bir işlem işlem modu ne olursa olsun, kendi işlem uygular. If TransProc bir hareket etkinken adlı iç içe geçmiş hareket TransProc büyük ölçüde yoksayılır ve kendi INSERT deyimleri kabul edildiğini veya toplu bağlı dış hareket için alınan son eylem geri. If TransProc Bekleyen bir hareketi olan bir işlem tarafından yürütülen işlemi yürütme yordamının sonunda, INSERT deyimleri etkin biçimde kaydeder.

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

Iç işlemler yapılıyor tarafından yoksayılır SQL Server Database Engine. Hareket olması kabul edildiğini veya dış işlem sonunda gerçekleştirilen eylem temel geri.Dış hareket tamamlanmış, iç iç içe geçmiş işlem de edilendir.Dış işlem geri alındı, sonra tüm iç hareketleri de geri, olup olmadığına iç hareketlerini ayrı ayrı olarak kaydedilmiş bakılmaksızın alınır.

Her bir çaðrý işlemi yürütme veya yürütme WORK son yürütülen BEGIN HAREKETI için geçerlidir.Sonra BEGIN TRANSACTION deyimlerini geçmişse, bir yürütme deyim, en içteki işlem yalnızca son iç içe geçmiş hareket için geçerlidir.Bile bir işlemi yürütme transaction_name deyim içinde bir iç içe geçmiş hareket dış işlem hareket adına başvuruyor, yalnızca en içteki hareketi yürütme uygulanır.

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.Bir ROLLBACK TRANSACTION if transaction_name deyim dış işlem adını kullanarak herhangi bir düzeyde yürütülür bir küme iç içe geçmiş işlem tüm iç içe geçmiş işlem geri alınır. Bir ROLLBACK WORK veya ROLLBACK TRANSACTION deyim olmadan, bir transaction_name parametresi herhangi bir düzeyde yürütülür bir küme iç içe geçmiş hareket, onu toplar iç içe geçmiş hareketler en dıştaki hareket de dahil olmak üzere, tüm yedekleme.

@@ TRANCOUNT işlev geçerli hareket iç içe düzey kaydeder.Her BEGIN TRANSACTION deyim @@ TRANCOUNT birer birer artar.Her TRANSACTION yürütme veya WORK yürütme deyim azaltır @@ TRANCOUNT tek.Bir ROLLBACK WORK veya bir işlem adı olan bir ROLLBACK TRANSACTION deyim geri tüm iç içe geçmiş işlem ve azaltır @@ TRANCOUNT 0 alır edin.Iç içe geçmiş işlem kümesindeki en dıştaki hareketin hareket adı kullanan BIR ROLLBACK TRANSACTION geldiğinde tüm iç içe geçmiş hareketler ve azaltır @@ TRANCOUNT 0 olarak yedekleyin.Zaten bir hareket, SELECT @@ 1 veya daha fazla olup olmadığını belirlemek için TRANCOUNT ise kullanacağınızdan emin olduğunuzda.@@ TRANCOUNT 0 ise, sizin bir işlem değildir.