You aren't checking for @@Transcount in your code. Also, you should use a try catch block and return after the error.
Create Procedure One as
declare @ErrorMessage varchar(300)
Begin Tran
begin try
exec two
end try
begin catch
if @@Transcount > 0
Rollback Tran
select @ErrorMessage = Error_Messate()
Raiserror (@ErrorMessage, 16,-1);
return
end catch
if @@Transcount > 0
Commit tran
go
Create Procedure two as
declare @ErrorMessage varchar(300)
Begin Tran
begin try
Update some tables
end try
Begin catch
if @@Transcount > 0
Rollback Tran
select @ErrorMessage = Error_Messate()
Raiserror (@ErrorMessage, 16,-1);
return
End catch
if @@Transcount > 0
Commit tran
go
For better, quicker answers, click on the following...
http://www.sqlservercentral.com/articles/Best+Practices/61537/
For better answers on performance questions, click on the following...
http://www.sqlservercentral.com/articles/SQLServerCentral/66909/