PDA

View Full Version : error 3990



resident
سه شنبه 21 دی 1395, 22:41 عصر
سلام.
من دو تا sp دارم که در زیر مینوسم. گاهی اوقات وقتی MainSP رو اجرا می کنم خظای 3930 رو میده که مربوط به Transactionهست.
روی SP به نام subsp زمانیکه به کد insert ای که قرمز کردم میرسه میپره تو catch و یعد این خطا رو میده. با اینکه دستور insert قرمز رنگ به لحاظ دستوری مشکل نداره.
کجای کدم مشکل داره؟


من TRy/Catch ها و Transaction ها رو برداشتم مشکل حل شد. به همین خاطر میدونم مشکل از اینهاست. ممنون میشم کمکم کنید



-----------------------------------------
ALTER Procedure MainSP

as
Begin

SET NOCOUNT ON;

Declare @PersonCompanyID int

Begin Tran
exec SubspName @ErrorNumber output
if @ErrorNumber!=0
begin
ROLLBACK TRANSACTION;
return
end

begin try
INSERT INTO ...
VALUES....
End Try
Begin Catch

IF @@TRANCOUNT > 0
begin
ROLLBACK TRANSACTION;
exec [system].[ErrorLogInsert] 'MainSP','',@UserID,@ErrorNumber out
return
end
End Catch

exec otger sp...
EXEC other sp2 @ErrorNumber output

if @ErrorNumber!=0
begin
ROLLBACK TRANSACTION;
return
end
commit tran



End

================================================== =======

ALTER procedure SubspName

as
begin
SET NOCOUNT ON;

Begin TRY
begin tran
declare @IsDuplicate bit


EXEC dbo.xxx x,y,@ErrorNumber OUTPUT

if @ErrorNumber!=0
begin
ROLLBACK TRANSACTION;
exec [system].[ErrorLogInsert] 'SubspName','',@UserID,@ErrorNumber out
return
end


if (.....)
begin
exec other sp
end


INSERT INTO (...)
VALUES(....)

set @ErrorNumber=@@ERROR

if @ErrorNumber!=0
begin
ROLLBACK TRANSACTION;
exec [system].[ErrorLogInsert] 'SubspName','',@UserID,@ErrorNumber out
return
end

set @ID=(SELECT SCOPE_IDENTITY())

commit tran


End Try
Begin Catch
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
exec [system].[ErrorLogInsert] 'SubspName','',@UserID,@ErrorNumber out

End Catch
END

حمیدرضاصادقیان
دوشنبه 18 بهمن 1395, 19:13 عصر
سلام
مشکل شما تداخل بین تراکنش هاست که به صورت تودرتو داره هندل میشه.
سعی کنید هر SP یک کاری انجام بده و اگر میخواهید لاگ کنید از یک منطق دیگه استفاده کنید.
من الان نمیدونم کدهای خطای شما چیه یا داخل کدهای شما چطوری دارید خطا رو برمیگردونید ولی میتونید از یک روش دیگه استفاده کنید
مثلا از دستور Output در Insert استفاده کنید.