这是我的存储过程的shell,其中没有省略必要的部分:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure --name of sproc
--declare sproc params
AS
BEGIN
SET XACT_ABORT ON
SET NOCOUNT ON
BEGIN TRY
BEGIN TRANSACTION
--declare a few vars
--declare some table variables
--do some work
IF (--some condition here)
BEGIN
--actually do the work
END
ELSE
BEGIN
ROLLBACK TRANSACTION
SET @error = 'some value cannot be NULL'
RAISERROR(@error, 16, 1)
RETURN @error
END
COMMIT
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
SELECT @error = ERROR_NUMBER()
, @message = ERROR_MESSAGE()
, @severity = ERROR_SEVERITY()
, @state = ERROR_STATE()
RAISERROR(@message, @severity, @state)
RETURN @error
END CATCH
END
GO
我在“ - 实际做一些工作”部分中遇到死锁错误(这不是本文的主题),然后抛出“Transaction count ...”错误。
我的COMMIT在错误的位置吗?
答案 0 :(得分:1)
将Begin Transaction
移到Begin Try
上方。如果尝试失败并跳转到catch,则try中初始化的所有内容都超出了范围。在try / catch范围之外开始事务使得try和catch块都可用。