【发布时间】:2012-02-17 16:57:51
【问题描述】:
谁能推荐对以下存储过程代码的改进。
过去,在 C# 中进行事务并从那里回滚对我来说总是最好的,但现在我需要拥有事务并尝试在 SP 本身中捕获块。
我在 SP 中发现了很多事务示例,并尝试捕获块,但合并的并不多。
我想知道的是下面的代码:
捕获所有错误
消除 SP 崩溃或超时的所有风险,并使事务保持打开状态而不回滚
-
即使发生错误,也消除 SP 提交的所有风险。
SET NOCOUNT ON; SET XACT_ABORT ON; --used so transaction is not left open in the even of an error or timeout DECLARE @Error int BEGIN TRANSACTION BEGIN TRY INSERT INTO Locations_Internal (Loc_Ref, Loc_Code, Loc_Desc, Company_For_Desc, Row_Updated_PDA_Sync) VALUES (@Loc_Ref, @Loc_Code, @Loc_Desc, @Company_For_Desc, 'invalid value'); SELECT @Error =@@ERROR; IF @@ERROR <> 0 GOTO ERR_HANDLER; --OTHER INSERT/DELETE/UPDATE Statements END TRY BEGIN CATCH SET @Error = @@ERROR; GOTO ERR_HANDLER; END CATCH COMMIT TRANSACTION RETURN 0; ERR_HANDLER: SELECT 'Unexpected error occurred!' ROLLBACK TRANSACTION RETURN @Error
感谢 Manjunatha Gouli 的回复,
如果插入语句失败但没有崩溃并抛出异常,它会继续执行其余过程吗?这甚至可能吗?
我问是因为我见过的大多数示例在每个 INSERT/UPDATE/DELETE/SELECT 语句之后检查@@error,在使用事务时是否仍然需要这种方法,或者每个错误都会被 catch 捕获而不是继续用代码。
如果我使用 try catch 块,我什至需要在 SP 中检查 @@ERROR 吗?所有提到这个的文章都是为没有实现 try catch 的旧版 MS SQL 设计的吗?
【问题讨论】:
标签: stored-procedures transactions try-catch