Без TRY / CATCH, это не пуленепробиваемый.
Ошибки могут быть пакетным прерыванием (например, преобразования типов данных или ошибки, вызванные триггерами), что означает, что ROLLBACK не запускается.
У вас есть для использования TRY / CATCH, и я всегда использую SET XACT_ABORT ON *
SET XACT_ABORT, NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
SET @sSystemLogDataId = CONVERT(NCHAR(36), NEWID());
INSERT INTO crddata.crd_systemlogdata (systemdataid,systemlogid,userid,
actiondatetime,actionstate)
VALUES(@sSystemLogDataId,@inSystemLogId,@sUserId,GETDATE(),@nActionState);
IF (1 = @nChangeMassprintTaskStatus)
BEGIN
UPDATE crddata.crd_massprinttasks SET massprinttaskstatus=@nMassprintTaskStatus
WHERE massprinttaskid = @inMassprintTaskId;
END
IF (@MassprintTaskType <> 1) AND (27 = @nActionState)
BEGIN
UPDATE crddata.crd_massprinttasks SET massprinttasktype=1
WHERE massprinttaskid = @inMassprintTaskId;
END
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 --may already be rolled back by SET XACT_ABORT or a trigger
ROLLBACK TRANSACTION;
RAISERROR [rethrow caught error using ERROR_NUMBER(), ERROR_MESSAGE(), etc]
END CATCH
Обязательным фоновым чтением является «Обработка ошибок в SQL 2005 и более поздних версиях» Эрланда Соммарскога : мы проверим вас позже ...