我们在 SQL Server 作业的每个步骤中都有 DML 操作。为了确保在出现问题时回滚更新/插入,我已将每个步骤的数据修改包装在TRY CATCH
和TRANSACTION
块中:
BEGIN TRY
BEGIN TRANSACTION
[[INSERT/update statements]] ...
IF @@TRANCOUNT > 0
BEGIN
COMMIT TRANSACTION
PRINT 'Successful.'
END
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION
PRINT 'Unsuccessful.'
END
END CATCH
它是否确保在发生错误时回滚数据操作?还是应该考虑其他因素?
会有更好的方法(使用配置等)吗?
谢谢你。
我宁愿推荐一种模式,比如异常处理和嵌套事务中的模式:
此模式检查
XACT_STATE()
catch 块中的 以防止不可提交的事务:您的代码正在检查
@@TRANCOUNT
它不能为 0 的地方,它混合使用信息性 PRINT 消息和 SELECT 结果集来传达成功,它不处理可恢复的错误。理想情况下,异常应该传播到客户端,在这种情况下传播到代理作业(即,您的捕获应该重新引发)。你所拥有的对我来说看起来不错。我建议您在回滚事务后对这些信息进行一些处理,例如将其写入日志。