CREATE PROCEDURE x AS SET NOCOUNT ON DECLARE @err int SET @err = 0 BEGIN TRANSACTION UPDATE myFirstTable ... SET @err = @@ERROR IF @err != 0 GOTO __cleanup UPDATE mySecondTable ... SET @err = @@ERROR IF @err != 0 GOTO __cleanup __cleanup: IF @err != 0 BEGIN IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION END ELSE BEGIN IF @@TRANCOUNT > 0 COMMIT TRANSACTION END RETURN CASE WHEN @err = 0 THEN 0 ELSE -1 ENDIf a proc does not initiate a transaction, it should do nothing with them.