Hola,
Hay varios problemas, pero el mas grave es la falta de capacidad del parser de SQL Server 2000 para generar un RAISE. En estos casos lo que tienes que hacer es preguntar por la variable @@ERROR (teniendo en cuenta que su valor cambia con cada ejecucion de una sentencia SQL), si es igual a 0, commit, y si es diferente de 0, rollback. Por ejemplo,
Código:
begin tran
insert
if @@error = 0
commit tran
else
rollback tran
De esta manera, solo se ejecuta un fin de transaccion.
Ahora bien, sigamos adelante, estoy suponiendo que el codigo posteado es solo un ejemplo, dado que no tiene sentido poner dentro de una transaccion explicita una sola sentencia SQL, para esto puedes leer el concepto de
Atomicidad y mas importante, como es su implementacion en SQL Server.
Por ultimo, y esto es a modo de sugerencia dado que pocas veces podemos decidir con que motor de base de datos vamos trabajar, te recomiendo SQL Server 2005, donde (era hora) se implementa el concepto de TRY / CATCH y el parser se encarga de los RAISE, por ejemplo
Código:
begin try
begin tran
insert 1
insert 2
update 1
delete 1
commit tran
end try
begin catch
rollback tran
end catch
Saludos