SQL – XACT_STATE
XACT_STATE işleminde aşağıdaki değerler dönecektir:
XACT_STATE Sonucu | Açıklaması |
0 | Etkin herhangi bir transaction yok. |
1 | Hali hazırda aktif olan ve commit edilebilir bir transaction var. |
-1 | Aktif transaction var fakat hata oluşmuş. Transaction sadece rollback edilebilir. |
Aşağıdaki örnekte XACT_STATE ifadesi kullanılmıştı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()) = -1
BEGIN
ROLLBACK TRANSACTION;
END;
ELSE .... -- provide for other outcomes of XACT_STATE()
END CATCH;
XACT_ABORT Kullanımı
Görüldüğü üzere SQL Server, transaction işleminde herhangi bir hata oluştuğunda otomatik rollback yapmaz. Bu ve önceki bölümde, commit ve rollback işlemleri için yoğunlukla TRY/CATCH kullanılmıştır. TRY/CATCH kullanılmayan durumlarda bir hata oluştuğunda otomatik rollback edebilmek için başka bir yöntem daha bulunmaktadır. XACT_ABORT ayarı ile, transaction çalışırken hata oluştuğunda rollback edilip edilmeyeceği ayarlanabilmektedir.
Varsayılan olarak, XACT_ABORT devre dışıdır. SET ile XACT_ABORT etkin hale getirilebilir:
SET XACT_ABORT ON;
SET XACT_ABORT ayarı ON durumundayken, TRY bloğu haricinde bir hata meydana gelirse tüm transaction işlemi sonlandırılarak rollback edilir. TRY bloğunda oluşan bir hatada ise, XACT_ABORT ayarına rağmen transaction açık tutulur fakat commit edilemez hale getirilmektedir.
KAYNAK: http://www.sqlekibi.com/sql-server/transactionlarin-kontrolu-2.html/