Olá Bruno!
Sim, é possível dentro de uma procedure que realize manipulação de dados reverter as alterações em caso de algum erro, porém para isso você terá que usar também o TRY...CATCH, para conseguir reverter em caso de erro, assim no bloco TRY, você vai realizar todas as manipulações, caso tenha alguma falha, no bloco CATCH, você pode executar um Rollback das transações. Na própria documentação do SQL Server, ele mostra como tratar extamente essa situação que você está com dúvida, o exemplo é:
Usando TRY...CATCH em uma transação
O exemplo a seguir mostra como um bloco TRY...CATCH funciona dentro de uma transação. A instrução dentro do bloco TRY gera um erro de violação de restrição.
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
Para se aprofundar mais você pode olhar na documentação
Espero ter ajudado!