İşlemlerdeki hataları işleme

Tamamlandı

Yapılandırılmış özel durum işleme, hataları test etmek ve hataları işlemek için TRY/CATCH yapısını kullanır. İşlemlerle özel durum işleme kullanılırken, COMMIT veya ROLLBACK anahtar sözcüklerini TRY/CATCH bloklarıyla ilgili olarak doğru yere yerleştirmek önemlidir.

İşlemleri taahhüt et

Yapılandırılmış özel durum işleme ile işlemleri kullanırken, AŞAĞıDAKI kod örneğinde olduğu gibi COMMIT TRANSACTION öğesini TRY bloğunun içine yerleştirin:

BEGIN TRY
 BEGIN TRANSACTION
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION
END TRY 

Geri alma işlemi

Yapılandırılmış özel durum işleme ile kullanıldığında, AŞAĞıDAKI kod örneğinde olduğu gibi ROLLBACK TRANSACTION değerini CATCH bloğunun içine yerleştirin:

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.Orders(custid, empid, orderdate)
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty)
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	ROLLBACK TRANSACTION;
END CATCH;

XACT_STATE

Etkin bir işlemi geri almaktan kaçınmak için XACT_STATE işlevini kullanın. XACT_STATE aşağıdaki değerleri döndürür:

Dönüş değeri Anlamı
1 Geçerli istek etkin, işlenebilir bir kullanıcı işlemine sahip.
0 Etkin işlem yok.
-1 Geçerli isteğin aktif bir kullanıcı işlemi var, ancak işlemin işlemi yapılamaz bir işlem olarak sınıflandırılmasına neden olan bir hata oluştu.

XACT_STATE, işlemin etkin olup olmadığını denetlemek için ROLLBACK komutundan önce kullanılabilir.

Aşağıdaki kod, CATCH bloğunda kullanılan XACT_STATE işlevini gösterir, böylece işlem yalnızca etkin bir kullanıcı işlemi varsa geri alınır.

BEGIN TRY
 BEGIN TRANSACTION;
 	INSERT INTO dbo.SimpleOrders(custid, empid, orderdate) 
	VALUES (68,9,'2006-07-12');
	INSERT INTO dbo.SimpleOrderDetails(orderid,productid,unitprice,qty) 
	VALUES (1, 2,15.20,20);
 COMMIT TRANSACTION;
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
	IF (XACT_STATE()) <> 0
    	BEGIN
        ROLLBACK TRANSACTION;
    	END;
	ELSE .... -- provide for other outcomes of XACT_STATE()
END CATCH;