2012-04-14 35 views
151

'daki işlemlerin doğru kullanımı 2 tane komutum var ve bunların ikisi de doğru şekilde yürütüldü ya da hiçbiri çalıştırılamıyor. Bu yüzden bir İşlem'e ihtiyacım var ama bunu nasıl kullanacağımı bilmiyorum.SQL Server 2008

Aşağıdaki kodda sorun nedir?

BEGIN TRANSACTION [Tran1] 

INSERT INTO [Test].[dbo].[T1] 
    ([Title], [AVG]) 
VALUES ('Tidd130', 130), ('Tidd230', 230) 

UPDATE [Test].[dbo].[T1] 
    SET [Title] = N'az2' ,[AVG] = 1 
    WHERE [dbo].[T1].[Title] = N'az' 

COMMIT TRANSACTION [Tran1] 
GO 

insert komut çalıştırılır ancak update komut bir sorunu vardır. Bunlardan herhangi birinin yürütme sırasında bir hatası varsa, her iki komutu da geri almak için bunu nasıl uygulayabilirim? işlem bu değişiklikleri taahhüt edecektir başarılı olursa işlem başarısız olursa

cevap

350

, bir deneme/yakalama bloğunu ekleyin işlem geri alınır:

BEGIN TRANSACTION [Tran1] 

BEGIN TRY 

INSERT INTO [Test].[dbo].[T1] 
    ([Title], [AVG]) 
VALUES ('Tidd130', 130), ('Tidd230', 230) 

UPDATE [Test].[dbo].[T1] 
    SET [Title] = N'az2' ,[AVG] = 1 
WHERE [dbo].[T1].[Title] = N'az' 


COMMIT TRANSACTION [Tran1] 

END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION [Tran1] 
END CATCH 

GO 
+13

Bu daha uygun bir cevaptır. –

+9

İyi cevap. Yazıldığı gibi, bu hata mesajını bastırır. Görüntülemeyi görüntülemek için geri alma işleminden sonra 'PRINT ERROR_MESSAGE() 'ı ekleyin. – atheaos

+1

BAŞLATMA İŞLEMİ [Tran1] '' TL'nin içine yerleştirilmemeli mi? Neyse - çok basit ve zarif bir kod parçası. –

95

saklı yordam başında biri talimat SET XACT_ABORT ON koymalıyız Sql Server, hata durumunda işlemi otomatik olarak geri alır. Ommited veya OFF olarak ayarlanmışsa, her bir ifadeden sonra @@ERROR'u test etmesi veya TRY ... CATCH rollback bloğunu kullanması gerekir.

+4

Bu kabul edilen cevap nasıl olabilir? –

+4

[doğru yanıt] olduğundan (https://msdn.microsoft.com/en-us/library/ms188792.aspx): "XACT_ABORT AYARI KAPALI olduğunda, bazı durumlarda yalnızca Transact-SQL deyimi hata geri alınır ve işlem devam eder.Yanlışın ciddiyetine bağlı olarak, XACT_ABORT KAPALI olduğunda bile tüm işlem geri alınabilir. KAPALI varsayılan ayardır. " Özgün soru, INSERT'nin neden gerçekleştiğidir, ancak UPDATE geri alınır. TRY-CATCH ile bile, INSERT'iniz önce çalışır ve işlenecektir. Bununla birlikte TRY-CATCH yine de esneklik için kullanılabilir. – 4AM

+1

Başka bir deyişle, ilk önce XACT_ABORT SET seçeneğini belirlemedikçe işleminiz atomik değildir. – 4AM

22

Kolay yaklaşım:

CREATE TABLE T 
(
    C [nvarchar](100) NOT NULL UNIQUE, 
); 

SET XACT_ABORT ON -- Turns on rollback if T-SQL statement raises a run-time error. 
SELECT * FROM T; -- Check before. 
BEGIN TRAN 
    INSERT INTO T VALUES ('A'); 
    INSERT INTO T VALUES ('B'); 
    INSERT INTO T VALUES ('B'); 
    INSERT INTO T VALUES ('C'); 
COMMIT TRAN 
SELECT * FROM T; -- Check after. 
DELETE T;