2016-03-18 22 views
3

aşağıdaki kodu bakın:İlk işlem; taahhüt iki işlemler

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
alter PROCEDURE TestProc 
AS 
BEGIN 
    begin try 

    SET NOCOUNT ON; 
    --SET XACT_ABORT on; 

    set transaction isolation level read committed 

    create table #Test (id int) 

    begin transaction 
    insert into #Test values (1) 
    begin transaction 
    insert into #Test values (2) 
    commit 
    select * from #test 
    commit 
    select * from #test 
    end try 

    begin catch 
    print 'got here 1' 
    end catch 
END 
GO 

bundan denir:

begin try 
exec TestProc 
end try 

begin catch 
print @@TRANCOUNT 
end catch 

çıktısı:

table 1: 
1 
2 

table 2: 
1 
2 

Neden ilk taahhüt etmez; Her iki işlemi de yapalım mı? Lütfen şu bağlantıya bakın: http://www.codeproject.com/Articles/4451/SQL-Server-Transactions-and-Error-Handling, "Bir dizi işlemin ne kadar derin olursa olsun, sadece son COMMIT'in bir etkisi vardır."

table 1 
1 
+0

"Yalnızca son COMMIT'in herhangi bir etkisi vardır" yalnızca son COMMIT'in "dış dünya" ile ilgili olduğu kadar bir COMMIT olduğu anlamına gelir. İç işlemlerde meydana gelen hiçbir şeyin dış işlem kapsamında gerçekleşmediği anlamına gelmez. –

+0

SQL Server'da iç içe geçmiş işlemler bir efsane. Beklediğiniz şeylere bile yaklaşmıyorlar. Paul Randal'ın konuyla ilgili blogunu okuyun. http://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/ –

cevap

3

SQL Server böyle olduğunu ayrıştırmak için gidiyor:

begin transaction 
    insert into #Test values (1) 
    begin transaction 
     insert into #Test values (2) 
    commit 
    select * from #test 
commit 
select * from #test 

ilk select * ilk hareket içindedir İlk tablo yalnızca bir satırı içermesi beklenir. Bu, daha önce o işlemde önceden yürütülen şeylere tam erişime sahip olduğu anlamına gelir. Daha sonra aynı işlemde yürütülen ifadeler, henüz işlenmemiş gibi kaydedilmemiş verilere erişebilir.

+0

Varsayılan yalıtım düzeyi, okunan okunur. Sadece benim OP'mize bir tane daha ifade eklediğimden emin olmak için, işlem yapılan okuma seviyesini okudum. Ancak, aynı sorunu görüyorum. Neden kaldırılmamış verilere erişiyor? – w0051977

+0

okuma işlemi, işlemin yürütülmesiyle aynı anda işlem dışından yürüten sorgulara uygulanır. –

+0

@ w0051977 * İşlemi * bu işlem bağlamında * işlenir *. Satırları tek seferde tek tek çalıştırıyorsanız (ve temp tablosu kullanmıyorsanız) ve aynı anda başka bir sorgu penceresinde her bir deyimden sonra 'MyTestTableName'dan * select * 'seçeneğini çalıştırırsanız, ilk eklemenin görünmeyeceğini görürsünüz. ikincisine kadar devam eder. –