2011-06-13 12 views
6

Şimdi bana ve iş arkadaşı hayati olmayan etkisiyle ilgili tartışıyoruz TRAN blokları COMMIT .... BEGIN TRAN. Ben basit bir ekleme-güncelleme-silme işlemleri için yaklaşık 140 Saklı yordamlar yazdım ve daha sonra onları bazı ekstra işlemleri yapmanız gerekebilir, çünkü ben zaten dahil ettik kudreti-be-Gerekli BEGIN TRAN ve şöyle TRAN blokları COMMIT :Bir işlem bloğu, SQL Server'daki performansı azaltır mı?

CREATE PROCEDURE [Users].[Login_Insert] 

     @Username   nvarchar (50) OUTPUT, 
     @Password   char (40), 
     @FullName   nvarchar (150), 
     @LoginTypeId  int 

AS 

SET NOCOUNT ON; 

BEGIN TRY 
BEGIN TRAN 

INSERT [Users].[Login] 
(
     [Username], 
     [Password], 
     [FullName], 
     [LoginTypeId] 
) 
VALUES 
(
     @Username, 
     @Password, 
     @FullName, 
     @LoginTypeId 
) 

COMMIT TRAN 
RETURN 1 
END TRY 

BEGIN CATCH 
ROLLBACK TRAN 

RETURN -1 
END CATCH 

GO 

Bu işlemlerin çoğu artık gerekli olmayabilir. Bu yabancı bloklar performansı belirgin bir şekilde etkileyecek mi? Şimdiden teşekkürler.

cevap

8

fark kadar değil. olduğu

, her TXN BEGIN TRAN ve INSERT arasında fazladan OhNoSecond için açık olacaktır. Birisi bunu ölçebilirse çok etkilenirim. Ben, bu yüzden bütün yazma procs% 100 tutarlı bunu aynı hata kaldırmaz,: Eğer BEGIN TRAN yapsam

Ancak daha sonra

iyi fikir olsa ... kullanıcı girişi, bacakların kırılma ihtiyaç sorulur vs iç içe geçebilir

Düzenleme: her zaman

Edit geri alır ve Savepoint

değil sahip olmasıdır: Remus'un sonra Nested stored procedures containing TRY CATCH ROLLBACK pattern? Bu Remus farklıdır cevap, benim yuva TXN şablonuna bağlantı kurmakta başarılı olamadı gör Hızlı ve kirli bir test,

0 numaralı işlemin zamanının 2/3'ü kadar hızlı olduğunu gösteriyor. onlar dramatik gruplama kesinleştirme floş log nedeniyle performansı artırabilir, güncelleme sırasını Geri
SET NOCOUNT ON 
SET STATISTICS IO OFF 

DECLARE @date DATETIME2 
DECLARE @noTran INT 
DECLARE @withTran INT 

SET @noTran = 0 
SET @withTran = 0 

DECLARE @t TABLE (ColA INT) 
INSERT @t VALUES (1) 

DECLARE 
    @count INT, 
    @value INT 

SET @count = 1 

WHILE @count < 100 
BEGIN 

    SET @date = GETDATE() 
    UPDATE smalltable SET smalltablename = CASE smalltablename WHEN 'test1' THEN 'test' ELSE 'test2' END WHERE smalltableid = 1 
    SET @noTran = @noTran + DATEDIFF(MICROSECOND, @date, GETDATE()) 

    SET @date = GETDATE() 
    BEGIN TRAN 
    UPDATE smalltable SET smalltablename = CASE smalltablename WHEN 'test1' THEN 'test' ELSE 'test2' END WHERE smalltableid = 1 
    COMMIT TRAN 
    SET @withTran = @withTran + DATEDIFF(MICROSECOND, @date, GETDATE()) 

    SET @count = @count + 1 
END 

SELECT 
    @noTran/1000000. AS Seconds_NoTransaction, 
    @withTran/1000000. AS Seconds_WithTransaction 

Seconds_NoTransaction Seconds_WithTransaction 
2.63200000    2.70400000 
2.16700000    2.12300000 

hiçbir ölçülebilir etkisi olacaktır yayınlanan kodunda aynı davranışı

+2

Bunu bir kez ölçtüm ve yapamadım. Ölçülebilir bir etki yok. –

+0

Umarım iş arkadaşım bunu görerek bir sonuca varır. Çok teşekkürler dostum – M2X

+0

(http://stackoverflow.com/questions/3201982/having-transaction-in-all-queries/3273661#3273661) –

5

engellemekle birlikte işlemler performansı üzerinde etkisi var mı veya hatalı yönetilen çekişme sorunları nedeniyle performansı önemli ölçüde azaltabilir. Ancak, işlemin doğru olması için 'un alt satırında,'a sahip olmanıza gerek yoktur. Bu söyleniyor ki, şablonunuz aslında oldukça kötü bir işlem ve deneme yakalama bloklarıdır. Bir yakalama bloğundaki transkript, XACT_STATE dönüş değerleri (-1, 0, 1) için üç durumlu bir mantık kontrolüne sahip olmalı ve düzgün bir şekilde işlenmemiş işlemleri ele almalıdır. Örnek için Exception handling and nested transactions'a bakın.

da, hiç dönüş kodu hata işleme ile işleme try-catch hata karıştırmak asla. Bir tane al ve onunla yap, tercihen dene. Diğer bir deyişle, saklı yordamınız RAISE olmalıdır, -1 döndürmez. Hata kodları ile karıştırma istisnası, kodunuzu korumak ve düzgün bir şekilde çağırmak için bir kabus yapar.

+0

eklemeden daha hızlıdır. Şöförünüz için teşekkürler – M2X

İlgili konular