如果我在SQL中创建存储过程并EXEC spStoredProcedure
在BEGIN/END TRANSACTION中调用它(),那么其他存储过程是否也属于事务?
我不知道它是否像C#中的try/catches一样工作.
是的,您在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'只会递减你的交易柜台.一旦将事务计数器减少为零,就会发生实际提交.