İşlemleri ve işlem gruplarını karşılaştırma

Tamamlandı

TRY/CATCH bloğu içinde yer alan T-SQL toplu işlemlerinin davranışını işlemlerin davranışıyla karşılaştırmak yararlı olur.

SalesLT.SalesOrderHeader tablosunda bir satır ve SalesLT.SalesOrderDetail tablosunda bir veya daha fazla satır gerektiren iki müşteri siparişi ekleyen aşağıdaki kodu göz önünde bulundurun. Tüm INSERT ifadeleri TRY bloğunun içine yerleştirilir.

  • İlk ekleme başarısız olursa, yürütme CATCH bloğuna geçer ve başka hiçbir kod çalıştırılmaz.
  • İkinci insert başarısız olursa, yürütme CATCH bloğuna geçer ve başka hiçbir kod yürütülmez. Ancak, ilk ekleme başarılı oldu ve geri döndürülmeyerek veritabanını tutarsız bir durumda bıraktı. Sipariş için bir satır eklendi, ancak sipariş ayrıntısı için satır eklenmedi.
BEGIN TRY
	INSERT INTO dbo.Orders(custid, empid, orderdate) 
		VALUES (68, 9, '2021-07-12');
	INSERT INTO dbo.Orders(custid, empid, orderdate) 
		VALUES (88, 3, '2021-07-15');
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty) 
		VALUES (1, 2, 15.20, 20);
	INSERT INTO dbo.OrderDetails(orderid,productid,unitprice,qty) 
		VALUES (999, 77, 26.20, 15);
END TRY
BEGIN CATCH
	SELECT ERROR_NUMBER() AS ErrNum, ERROR_MESSAGE() AS ErrMsg;
END CATCH;

Kodu bir işlem içinde uygulamak için bunu karşılaştırın. TRY/CATCH bloğu hata işleme için hala kullanılır, ancak Orders ve OrderDetails tablolarının INSERT deyimleri BEGIN TRANSACTION/COMMIT TRANSACTION anahtar sözcüklerinin içine alınır. Bu, tüm deyimlerin başarılı veya başarısız olan tek bir işlem olarak değerlendirilmesini sağlar. Bir satır hem Orders hem de OrderDetails tablosuna yazılır veya hiçbir satır eklenmez. Bu şekilde veritabanı hiçbir zaman tutarsız bir durumda olamaz.

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