下面是我的存储过程的外壳,其中没有省略必要的部分:
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
我得到一个死锁错误(这不是这篇文章的主题)在"——实际上做一些工作"部分,然后"事务计数…"错误被抛出。
我的COMMIT在错误的地方吗?
将Begin Transaction
移至Begin Try
上方。如果try失败并跳转到catch,则在try中初始化的所有内容都将超出范围。在try/catch范围之外开始事务使try和catch块都可用。