İşlemlerdeki hataları işleme
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;