【发布时间】:2018-05-29 01:06:18
【问题描述】:
基于 Microsoft 文档关于 TRY...CATCH 当 XACT_STATE 为 -1 时,Transactions are Uncommittable (TRY...CATCH (Transact-SQL)):
不可提交的交易和 XACT_STATE
如果在 TRY 块中生成的错误导致当前的状态 交易无效,该交易被归类为 不可提交的交易。 通常会结束交易的错误 在 TRY 块之外导致事务进入不可提交 错误发生在 TRY 块内时的状态。 不可提交 事务只能执行读取操作或 ROLLBACK 交易。事务无法执行任何 Transact-SQL 将生成写操作或 COMMIT 的语句 交易。 XACT_STATE 函数返回值 -1,如果 交易被归类为不可提交交易。什么时候 批处理完成后,数据库引擎回滚任何活动的 不可提交的交易。如果在发送时没有发送错误消息 事务进入不可提交状态,当批处理完成时, 将向客户端应用程序发送一条错误消息。这 表示检测到并滚动了一个不可提交的事务 返回。
如果我理解正确,每个停止 TRY 块连续性并进入 CATCH 块的错误都会导致 XACT_STATE 为 -1(当 XACT_ABORT 为 ON 时),但在上述文档的示例 C 中检查它是否为 1 :
。 . .结束尝试开始捕捉 -- 执行错误检索例程。
执行 usp_GetErrorInfo;-- Test XACT_STATE: -- If 1, the transaction is committable. -- If -1, the transaction is uncommittable and should -- be rolled back. -- XACT_STATE = 0 means that there is no transaction and -- a commit or rollback operation would generate an error. -- Test whether the transaction is uncommittable. IF (XACT_STATE()) = -1 BEGIN PRINT N'The transaction is in an uncommittable state.' + 'Rolling back transaction.' ROLLBACK TRANSACTION; END; -- Test whether the transaction is committable. IF (XACT_STATE()) = 1 BEGIN PRINT N'The transaction is committable.' + 'Committing transaction.' COMMIT TRANSACTION; END; END CATCH; GO
我的问题在这里:
这是错误的例子吗?如果不是,什么样的错误会导致 CATCH 块中的 XACT_STATE 为 1(可提交)?
【问题讨论】:
标签: sql-server error-handling transactions try-catch