Mil*_*les 39 sql sql-server stored-procedures rollback sqltransaction
如果我在SQL中创建存储过程并EXEC spStoredProcedure在BEGIN/END TRANSACTION中调用它(),那么其他存储过程是否也属于事务?
我不知道它是否像C#中的try/catches一样工作.
Blo*_*ard 40
是的,您在Begin Transaction和Commit(或Rollback)之间执行的所有操作都是事务的一部分.
Mil*_*les 12
听起来很棒,谢谢你们.我最终做了这样的事(因为我在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
Run Code Online (Sandbox Code Playgroud)
我相信在MS SQL Server中,存储过程执行会在事务中发生,但要非常小心.如果您有嵌套事务(即存储过程之外的事务和存储过程中的不同事务),则回滚将影响所有事务,而不仅仅是最近的封闭事务.
正如克里斯提到的,你应该小心滚动交易.
特别是这个:
IF @@TRANCOUNT > 0 ROLLBACK
Run Code Online (Sandbox Code Playgroud)
并不总是你想要的.你可以这样做
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
Run Code Online (Sandbox Code Playgroud)
这样,调用proc可以检查存储过程的返回值,并确定是否要继续提交或继续冒泡错误.
原因是'COMMIT'只会递减你的交易柜台.一旦将事务计数器减少为零,就会发生实际提交.