对于SQL Server 2008,我在每个存储过程的末尾都有next块
BEGIN TRY
BEGIN TRAN
-- my code
COMMIT
END TRY
BEGIN CATCH
IF (@@trancount > 0)
BEGIN
ROLLBACK
DECLARE @message NVARCHAR(MAX)
DECLARE @state INT
SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
RAISERROR (@message, 11, @state)
END
END CATCH是否可以将CATCH-block切换到
BEGIN CATCH
ROLLBACK
DECLARE @message NVARCHAR(MAX)
DECLARE @state INT
SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
RAISERROR (@message, 11, @state)
END CATCH或者只是
BEGIN CATCH
ROLLBACK
END CATCH发布于 2010-05-09 18:58:36
实际上,如果我已经在一个事务中,我永远不会启动一个新的事务。
它处理嵌套的存储过程、分布式TXNs和TransactionScope
记住,无论如何,还是有no such thing as a nested transaction in SQL Server的。
DECLARE @StartTranCount int
BEGIN TRY
SET @StartTranCount = @@TRANCOUNT
IF @StartTranCount = 0 BEGIN TRAN
-- my code
IF @StartTranCount = 0 COMMIT TRAN
END TRY
BEGIN CATCH
IF @StartTranCount = 0 AND @@trancount > 0
BEGIN
ROLLBACK TRAN
DECLARE @message NVARCHAR(MAX)
DECLARE @state INT
SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
RAISERROR (@message, 11, @state)
END
/*
or just
IF @StartTranCount = 0 AND @@trancount
ROLLBACK TRAN
*/
END CATCH发布于 2010-05-09 18:12:43
在尝试回滚之前,您需要检查作用域中是否存在事务。
您可以使用以下内容:
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;这将回滚事务,但不会向应用程序报告任何错误。
有关更多信息,请查看MSDN。
https://stackoverflow.com/questions/2797289
复制相似问题