SQL Server 在开始/END TRANSACTION内部执行存储过程

kpbwa7wx  于 2023-01-04  发布在  其他
关注(0)|答案(7)|浏览(225)

如果我在SQL中创建一个存储过程,并在开始/END TRANSACTION中调用它(EXEC spStoredProcedure),这个存储过程是否也属于事务?
我不知道它是否像C#中的try/cooks一样工作。

uemypmqf

uemypmqf1#

是的,在开始事务和提交(或回滚)之间所做的 * 所有事情 * 都是事务的一部分。

6yoyoihd

6yoyoihd2#

听起来不错,谢谢。我最后做了这样的事情(因为我在05)

BEGIN TRY
       BEGIN TRANSACTION

       DO SOMETHING

       COMMIT
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
         ROLLBACK

      -- Raise an error with the details of the exception
      DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
      SELECT @ErrMsg = ERROR_MESSAGE(),
             @ErrSeverity = ERROR_SEVERITY()

      RAISERROR(@ErrMsg, @ErrSeverity, 1)
    END CATCH
lkaoscv7

lkaoscv73#

我相信在MS SQL Server中,存储过程的执行会发生在事务内,但要非常小心。如果您有嵌套事务(即存储过程外的事务和存储过程内的另一个事务),回滚将影响所有事务,而不仅仅是最近的封闭事务。

cwdobuhd

cwdobuhd4#

正如Chris提到的,您应该小心回滚事务。
具体而言:

IF @@TRANCOUNT > 0 ROLLBACK

并不总是你想要的。你可以这样做

IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error

这样,调用proc就可以检查存储过程的返回值,并确定它是要提交还是继续引发错误。
原因是“COMMIT”只会减少事务计数器。一旦它将事务计数器减少到零,那么实际的提交将发生。

nzk0hqpo

nzk0hqpo5#

正如Chris和James提到的,在处理嵌套事务时需要小心,有一组关于事务主题的非常好的文章是由Don PetersonSQL Server Centra l上写的,我建议你读一读这些文章:
这里有:

7uhlpewt

7uhlpewt6#

是的,所有嵌套存储过程调用都包括在事务范围中。如果使用的是SQL Server 2005或更高版本,则还可以使用Try...Catch。Here提供了有关此操作的详细信息。

ki0zmccv

ki0zmccv7#

@克里斯,我不知道。
当我在谷歌上搜索更多信息时,我发现了this--你可以设置“保存点”,它可以被回滚到而不回滚整个事务。
在这种情况下可能会有用。

相关问题