我在 SQL Server 2008 的每个存储过程的末尾都有下一个 block
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
?
最佳答案
实际上,如果我已经进行过交易,我就不会开始新的交易。
这涉及嵌套存储过程、分布式 TXN 和 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
关于t-sql - 我是否必须在 T-SQL 中的 catch block 中回滚事务之前对事务进行计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797289/