İş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, veya ROLLBACK anahtar sözcüklerini TRY/CATCH bloklarıyla ilgili olarak doğru yere yerleştirmek COMMIT ö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 TRY bloğunun içine yerleştirin COMMIT TRANSACTION :

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 CATCH bloğunun içine yerleştirin ROLLBACK TRANSACTION :

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 işlevini kullanın XACT_STATE . XACT_STATE aşağıdaki değerleri döndürür:

Dönüş değeri Anlamı
1 Geçerli oturumda etkin bir kullanıcı işlemi var. Oturum, veri yazma ve işlemi işleme dahil olmak üzere tüm eylemleri gerçekleştirebilir.
0 Etkin işlem yok.
-1 Geçerli oturumda etkin bir kullanıcı işlemi var, ancak işlemi yaygın olmayan olarak sınıflandıran bir hata oluştu. Oturum kayıt noktası işleyemiyor veya geri alamıyor; yalnızca okuma gerçekleştirebilir ve tam ROLLBACK TRANSACTIONbir yayın yapmalıdır.

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

Aşağıdaki kod, CATCH bloğu içinde XACT_STATE kullanılan işlevi gösterir. Durum (işlenebilir) durumundan -1 (tam olarak geri alınması gerekir) durumu 1 ayırt eder (işlenebilir):

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;

	-- Test for uncommittable transaction (for example, caused by SET XACT_ABORT ON).
	IF XACT_STATE() = -1
	BEGIN
		ROLLBACK TRANSACTION;
	END;

	-- Test for active, committable transaction.
	IF XACT_STATE() = 1
	BEGIN
		COMMIT TRANSACTION;
	END;
	-- If XACT_STATE() = 0, there is no active transaction; no action needed.
END CATCH;