- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 TRY CATCH
block 的 MSDN 文档有疑问。查看这篇文章并向下滚动到示例 C“使用 TRY…CATCH 和 XACT_STATE”
http://msdn.microsoft.com/en-us/library/ms175976.aspx
该示例首先在 Try block 中放置一个 COMMIT TRANSACTION
,然后如果 XACT_STATE()=1
,则在 Catch block 中放置第二个。
但是我认为 Catch block 只会在发生错误时执行。那么 Catch block 如何执行并且 XACT_STATE 返回 1 呢?这看起来很矛盾。
XACT_STATE
文档中有一条未答复的评论提出了同样的问题
最佳答案
@user1181412 我的分析如下:此评论:
-- A FOREIGN KEY constraint exists on this table.
--This statement will generate a constraint violation error
是你问题的答案。发生的情况是,当 DELETE 语句执行时,它会生成约束违反错误,并且后续的 COMMIT 不会执行。事务的 XACT_STATE 现在为 1,并且 CATCH block 正在执行。
在顶部,您有
SET XACT_ABORT ON;
这会导致事务状态不可提交,因此此代码块将回滚事务:
-- 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;
但是,如果更改为“SET XACT_ABORT OFF;”那么 CATCH block 将会被命中,尽管事务状态将是“可提交的”,如XACT_STATE = 1。
注意:删除仍然不会完成,因为约束违规仍然存在,但您会看到打印:
(1 row(s) affected) The transaction is committable.Committing transaction.
关于SQL Server TRY...CATCH 与 XACT_STATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16043513/
我对 TRY CATCH block 的 MSDN 文档有疑问。查看这篇文章并向下滚动到示例 C“使用 TRY…CATCH 和 XACT_STATE” http://msdn.microsoft.co
基于有关 TRY...CATCH 的 Microsoft 文档,当 XACT_STATE 为 -1 时,事务不可提交 (TRY...CATCH (Transact-SQL)): Uncommittab
我是一名优秀的程序员,十分优秀!