执行存储的过程内部开始/端的事务
-
05-07-2019 - |
题
如果我创建了一个存储的过程中SQL,并呼吁它(EXEC spStoredProcedure
)内开始/端的事务,这是其他储存过程也陷入的交易?
我不知道,如果它的工作喜欢尝试/渔获量。
解决方案
是的,在Begin Transaction和Commit(或Rollback)之间执行的所有是事务的一部分。
其他提示
听起来很棒,多亏了一堆。我最终做了这样的事情(因为我在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
我相信在MS SQL Server中,存储过程执行会在事务中发生,但要非常小心。如果您有嵌套事务(即存储过程之外的事务和存储过程中的不同事务),则回滚将影响所有事务,而不仅仅是最近的封闭事务。
正如克里斯所说,你应该小心滚动交易。
特别是:
IF @@TRANCOUNT > 0 ROLLBACK
并不总是你想要的。你可以做这样的事情
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
这样,调用proc可以检查存储过程的返回值,并确定是否要提交或继续冒出错误。
原因是'COMMIT'只会递减您的交易柜台。一旦将事务计数器减少到零,就会发生实际提交。
是的,所有嵌套存储过程调用都包含在事务范围内。如果您使用的是SQL Server 2005或更高版本,则也可以使用Try ... Catch。 此处更详细。
@Chris,我不知道。
在Google上搜索更多信息时,我遇到了这个 - 您可以设置“保存点”,可以回滚到该保存点而不回滚整个事务。
在这种情况下可能有用。
不隶属于 StackOverflow