【发布时间】:2010-09-15 20:33:10
【问题描述】:
如果我在 SQL 中创建一个存储过程并在 BEGIN/END TRANSACTION 中调用它 (EXEC spStoredProcedure),这个其他存储过程是否也属于该事务?
我不知道它是否像 C# 中的 try/catch 一样工作。
【问题讨论】:
标签: sql sql-server stored-procedures rollback sqltransaction
如果我在 SQL 中创建一个存储过程并在 BEGIN/END TRANSACTION 中调用它 (EXEC spStoredProcedure),这个其他存储过程是否也属于该事务?
我不知道它是否像 C# 中的 try/catch 一样工作。
【问题讨论】:
标签: sql sql-server stored-procedures rollback sqltransaction
听起来不错,非常感谢。我最终做了这样的事情(因为我在 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
【讨论】:
正如Chris 和James 提到的,在处理嵌套事务时需要小心。 Don Peterson 在SQL Server Central 上有一组关于交易主题的非常好的文章,我建议您阅读一下:
这里有:
【讨论】:
【讨论】:
正如 Chris 所说,您应该小心回滚事务。
具体如下:
IF @@TRANCOUNT > 0 ROLLBACK
并不总是你想要的。你可以这样做
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
这样,调用 proc 可以检查存储过程的返回值,并确定它是要提交还是继续冒泡错误。
原因是“COMMIT”只会减少您的交易计数器。一旦它将事务计数器减为零,就会发生实际的提交。
【讨论】:
是的,所有嵌套的存储过程调用都包含在事务范围内。如果您使用的是 SQL Server 2005 或更高版本,您也可以使用 Try...Catch。 Here 对此有更详细的说明。
【讨论】:
我相信在 MS SQL Server 中,存储过程的执行会发生在事务中,但要非常小心。如果您有嵌套事务(即存储过程外部的事务和存储过程内部的不同事务),回滚将影响所有事务,而不仅仅是最近的封闭事务。
【讨论】:
是的,您在开始事务和提交(或回滚)之间所做的一切都是事务的一部分。
【讨论】: