【发布时间】:2018-10-09 10:03:03
【问题描述】:
我有一个 TRY CATCH 语句,其中 TRY 中的事务中有一些代码,而 TRY 中有事务之外的其他代码。如果事务外部的代码(仍在 TRY 中)抛出错误,我的事务不会在 CATCH 中回滚。但是,如果我删除事务之外的代码,如果出现错误,事务将被回滚。为什么会这样? SQL Server 2014。
我的代码。如果 Remote proc 抛出错误,则事务不会回滚:
BEGIN try
begin transaction
INSERT INTO bos_south_florida_job_map (job_id, original_job_id,
created_date, updated_date,completed_status_sent_ind,
assigned_status_sent_ind, status_prev)
VALUES (9999, '1234', getdate(), getdate(),0,0,'CREATED');
COMMIT TRANSACTION
declare @sql varchar(max)
set @sql = ''
select @sql = '
declare @error1 varchar(255),
@error2 varchar(255),
@error3 varchar(255)
Exec NEXTGEN.DBO.wbAf_ConfirmDispatchedReservation ''AFFWEB'', ''A10596'', ''Admin'', ''Admin'', '''+cast(preassignedsubconcode as varchar(100))+''', '''+cast('1234' as varchar(20))+''', '''+convert(char(23),ISNULL(ScheduledDispatchDateTime,''),121)+''', '+cast('1234' as varchar(12))+',null,@error1 output,@error2 output,@error3 output
if @error1 is not null or @error2 is not null or @error3 is not null
begin
set @error1 = @error2 + '' '' + @error3 + '' '' + @error1
RAISERROR (@error1, 16, 1)
end
'
from [BCCUATWSQL290].NEXTGEN.DBO.tbRideResCurDispatch
where resno = '35002616'
exec(@sql) at [BCCUATWSQL290]
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE()
INSERT INTO bos_south_florida_error_log (original_job_id, [action],
error_datetime, [error_message])
SELECT
'1234',
'CREATE_JOB',
GETDATE(),
'Msg: ' + ISNULL(CONVERT(VARCHAR, ERROR_NUMBER()), 'N/A') + ', Level: ' + ISNULL(CONVERT(VARCHAR, @ErrorSeverity), 'N/A') + ', Line: ' + ISNULL(CONVERT(VARCHAR, ERROR_LINE()), 'N/A') + ', Error: ' + ISNULL(@ErrorMessage, 'N/A')
END CATCH
这将回滚事务:
BEGIN try
begin transaction
INSERT INTO bos_south_florida_job_map (job_id, original_job_id,
created_date, updated_date,completed_status_sent_ind,
assigned_status_sent_ind, status_prev)
VALUES (9999, '1234', getdate(), getdate(),0,0,'CREATED');
RAISERROR ('BLAH', 16, 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE()
INSERT INTO bos_south_florida_error_log (original_job_id, [action],
error_datetime, [error_message])
SELECT
'1234',
'CREATE_JOB',
GETDATE(),
'Msg: ' + ISNULL(CONVERT(VARCHAR, ERROR_NUMBER()), 'N/A') + ', Level: ' + ISNULL(CONVERT(VARCHAR, @ErrorSeverity), 'N/A') + ', Line: ' + ISNULL(CONVERT(VARCHAR, ERROR_LINE()), 'N/A') + ', Error: ' + ISNULL(@ErrorMessage, 'N/A')
END CATCH
【问题讨论】:
标签: sql sql-server sql-server-2012