PDA

View Full Version : اجرای Transactional دو Stored Procedure



eskandary.a
یک شنبه 03 بهمن 1389, 11:18 صبح
سلام
یک سوال در مورد Transaction دارم؟
من 2 جدول دارم و 2 تا sp نوشتم برای insert در این جدول ها؛ توی هر دو sp دارم transaction را چک میکنم.
حالا یک جای برنامه لازم شده این دو sp رو پشت سر هم صدا بزنم. می خوام بدونم چطور میشه چک کزد هر دو sp کامل اجرا بشه و اگر دومی اجرا نشد اثر اولی از بین بره؟

behrouzlo
یک شنبه 03 بهمن 1389, 13:11 عصر
از ساختار Try Catch استفاده کنید و بعد از Roll Back کردن sp دومی با استفاده از RAISERROR یک خطا ایجا کنید و در SP اول در قسمت Catch باز تراکنش را Roll Back کنید.

shgroup
یک شنبه 03 بهمن 1389, 19:02 عصر
از ساختار Try Catch استفاده کنید و بعد از Roll Back کردن sp دومی با استفاده از RAISERROR یک خطا ایجا کنید و در SP اول در قسمت Catch باز تراکنش را Roll Back کنید.

لطفا مثال بزنید ؟!

eskandary.a
یک شنبه 03 بهمن 1389, 19:33 عصر
از ساختار Try Catch استفاده کنید و بعد از Roll Back کردن sp دومی با استفاده از RAISERROR یک خطا ایجا کنید و در SP اول در قسمت Catch باز تراکنش را Roll Back کنید.

سلام
ممنون از شما ولی در صورت امکان بیشتر توضیح دهید (این دو sp را برای نمونه ببینید و توضیح دهید)

CREATE PROCEDURE [dbo].[Sp1]

AS
BEGIN


BEGIN TRY
BEGIN TRANSACTION

INSERT INTO [dbo].[Table_One]
(
/*
Some Fields

*/

)
VALUES
(
/*
Some Value
*/

)
COMMIT TRANSACTION

END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
INSERT [dbo].[ErrorLog]
(
[UserName],
[ErrorNumber],
[ErrorSeverity],
[ErrorState],
[ErrorProcedure],
[ErrorLine],
[ErrorMessage],

)
VALUES(
CONVERT(sysname, CURRENT_USER),
ERROR_NUMBER(),
ERROR_SEVERITY(),
ERROR_STATE(),
ERROR_PROCEDURE(),
ERROR_LINE(),
ERROR_MESSAGE(),

)

END CATCH
E:
END






و


CREATE PROCEDURE [dbo].[Sp2]

AS
BEGIN


BEGIN TRY
BEGIN TRANSACTION

INSERT INTO [dbo].[Table_Two]
(
/*
Some Fields

*/

)
VALUES
(
/*
Some Value
*/

)
COMMIT TRANSACTION

END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
INSERT [dbo].[ErrorLog]
(
[UserName],
[ErrorNumber],
[ErrorSeverity],
[ErrorState],
[ErrorProcedure],
[ErrorLine],
[ErrorMessage],

)
VALUES(
CONVERT(sysname, CURRENT_USER),
ERROR_NUMBER(),
ERROR_SEVERITY(),
ERROR_STATE(),
ERROR_PROCEDURE(),
ERROR_LINE(),
ERROR_MESSAGE(),

)

END CATCH
E:
END