Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Muss ich Transaktionen zählen, bevor ich eine im Catch-Block in T-SQL zurücksetze?

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