我有一个仅执行存储过程的 SQL 作业。每天早上当作业尝试运行时,我都会收到以下错误:
当前事务无法提交,并且无法支持写入日志文件的操作。
当我继续尝试重新启动作业时,它总是给我同样的错误。但是,如果我只是执行存储过程而不使用作业,它就可以正常工作。
这是非常非常棘手的部分。如果我只是运行存储过程,取消它,然后运行作业,则作业工作得很好。
有没有人遇到过这个相当独特的问题或者有任何想法可能导致它?
此错误表明您正在尝试在注定失败的事务期间执行记录的操作。如果您忽略了 BEGIN CATCH 块,则只会发生这种情况XACT_状态-1 的值:
当前请求有一个活跃用户
交易,但发生错误
这导致交易
被归类为不可承诺的
交易。请求无法提交
事务或回滚到
保存点;它只能请求完整的
事务的回滚。这
请求无法执行任何写入
操作直到回滚
交易。该请求只能
执行读操作直到滚动
退回交易。之后
事务已被回滚,
请求可以执行读取和
写操作并可以开始新的
交易。
事实上,您尝试执行此操作仅表明您的异常处理存在代码问题(换句话说,您的过程有错误)。我最近在博客上谈到使用 BEGIN TRY/BEGIN CATCH 的过程模板您可以以此为起点来修复您的程序。厄兰·索马斯科格 (Erland Sommarskog)关于 Transact-SQL 错误处理的著名文章,但这并没有太深入地涵盖 BEGIN TRY/BEGIN CATCH 。
通过适当的错误处理,您可以找出发生的原始错误并导致 CATCH 块首先被执行。既然您提到手动运行该过程不会导致任何问题,那么问题可能是 SQL 代理作业和手动执行之间的上下文差异。如果没有任何数据,我无法诊断问题,但我猜测最可能的原因是安全上下文的差异(即代理登录缺少您自己的登录所拥有的某些权限)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)