Tatsächlich beginne ich nie eine neue Transaktion, wenn ich bereits in einer bin.
Dies behandelt verschachtelte gespeicherte Prozesse, verteilte TXNs und TransactionScope
Denken Sie daran, es gibt keine verschachtelten Transaktionen in SQL Server ohnehin.
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