טיפול בשגיאות בטרנזקציות

הושלם

טיפול בחריגים מובנים משתמש במבנה TRY/CATCH כדי לבדוק אם קיימים שגיאות וכיצד לטפל בשגיאות. בעת שימוש בטיפול בחריגים עם טרנזקציות, חשוב למקם את מילות המפתח COMMIT או החזרה למצב קודם במקום הנכון ביחס לבלוקים TRY/CATCH.

בצע טרנזקציות

בעת שימוש בטרנזקציות עם טיפול מובנים בחריגים, מקם את COMMIT TRANSACTION בתוך בלוק TRY כמו בדוגמה הבאה של הקוד:

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 

חזרה למצב קודם של טרנזקציה

בעת שימוש עם טיפול מובנים בחריגים, מקם את ה- ROLLBACK TRANSACTION בתוך בלוק CATCH כמו בדוגמה הבאה של הקוד:

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

כדי למנוע החזרה של טרנזקציה פעילה, השתמש XACT_STATE הפונקציה. XACT_STATE מחזירה את הערכים הבאים:

ערך חזרה משמעות
1 הבקשה הנוכחית כוללת טרנזקציית משתמש פעילה וטבלת ביצוע.
0 אין טרנזקציה פעילה.
-1 הבקשה הנוכחית כוללת טרנזקציית משתמש פעילה, אך אירעה שגיאה שגרמה לסווג את הטרנזקציה כטרנזקציה שאינה צפויה לתשלום.

XACT_STATE להשתמש לפני הפקודה חזרה למצב קודם, כדי לבדוק אם הטרנזקציה פעילה.

הקוד הבא מציג את XACT_STATE הנמצאת בשימוש בתוך בלוק CATCH כך שהטרנזקציה מוחזרת למצב קודם רק אם קיימת טרנזקציית משתמש פעילה.

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;