The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION Below is an excerpt of an 800 line stored procedure that is failing with this error now. I say now because this is not new code. This script is scheduled to run every few minutes and has worked for a year.

ALTER PROCEDURE [dbo].[bsi_transfer_reallocate] @transfer_no int
AS  
BEGIN
BEGIN TRY  


[a few lines of code]

  BEGIN TRANSACTION REALLOCATE;


(over 700 lines of code)

  COMMIT TRANSACTION REALLOCATE;
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION REALLOCATE;
    SET @dbg_msg = 'Transfer ' + CAST(@transfer_no AS varchar(8)) + ' aborted due to error condition with error number ' +
       CAST(ERROR_NUMBER() AS varchar(200)) + ' and message ' + ERROR_MESSAGE()
    INSERT INTO BATTERY_debug VALUES ('REALLOCATION Failure', GETDATE(), @dbg_msg)
    select  @dbg_msg
    RETURN (1)
END CATCH
END
return(0)
Some errors automatically rollback the transaction.  See generally 
Error and Transaction Handling in SQL Server

And if your error already rolled back the transaction, the first line of your catch block will throw this error.  

So replace

  ROLLBACK TRANSACTION REALLOCATE;


with

 if @@trancount &gt; 0 ROLLBACK TRANSACTION;


(Remove the 'REALLOCATE' label because this will NOT roll back only the nested transaction.  A Nested Transaction can have a name, but cannot be individually rolled back.  For that you would need a savepoint, but that's probably not the issue here).