当前位置: 首页 > 知识库问答 >
问题:

在MS SQL Server中导致XACT_STATE为1的错误类型是什么?

百里金林
2023-03-14

根据关于try...catch的Microsoft文档,当XACT_STATE为-1时,事务是不可提交的(try...catch(Transact-SQL)):

不可提交事务和XACT_STATE

如果TRY块中生成的错误导致当前事务的状态无效,则该事务被分类为不可提交事务。通常在TRY块外结束事务的错误导致当错误发生在TRY块内时事务进入不可提交状态。不可提交事务只能执行读操作或回滚事务。事务不能执行任何会生成写操作或提交事务的Transact-SQL语句。如果事务被分类为不可提交事务,XACT_STATE函数返回值-1。当批处理完成时,数据库引擎回滚所有活动的不可提交事务。如果事务进入不可提交状态时没有发送错误消息,则当批处理完成时,将向客户端应用程序发送错误消息。这表示检测到一个不可提交的事务并将其回滚。

如果我理解正确的话,每一个停止TRY块连续性并进入CATCH块的错误都会导致XACT_STATE为-1(当XACT_ABORT为ON时),但是在所提到的文档的示例C中,如果是1则检查它:

...结束TRY开始CATCH--执行错误检索例程。
执行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(可提交)?

共有1个答案

仉臻
2023-03-14

SQL Server可以容忍事务中的某些错误,而不必将其标记为不可提交。例如,SELECT 1/0将导致错误,但不会强制事务进入不可提交状态。(引自https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-develop-transactions。)

事实上,除非XACT_ABORT处于打开状态,否则几乎任何非致命错误都将产生1的XACT_STATE(pk冲突、数据类型转换、约束冲突等)。(摘自https://www.sqlservercentral.com/forums/topic1109613-1550-1.aspx)。

 类似资料:
  • 考虑一下: 这种行为的原因可能是什么?

  • 我在应用程序部署期间进行Hibernate验证时遇到了一些问题。我有两个类,Frame和FrameReleasePlan,它们在OneToOne关系中关联。在数据库端,关系是单向的。frame_release_planss表有一个NUMERIC(19,0)类型的“frame_id”列,它是一个指向frame表“id”列的外键。当我尝试部署时,模式验证失败并出现错误: 无法生成Hibernate S

  • 为什么我会。。。 未捕获的类型错误:string.split 不是一个函数 ...当我跑步时...

  • 问题内容: 为什么我收到此PHP错误? 问题答案: 该PHPUnit文档 说 过去常说,包括/需要的PHPUnit / Framework.php,如下所示: 更新 从PHPUnit 3.5开始,有一个内置的autoloader类将为您处理此问题: 感谢Phoenix指出这一点!

  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 问题内容: 我为正在编写的Java程序定义了两个类,分别称为Class1和Class2。在Class1的构造函数主体中,我调用了class 2的构造函数。但是,出现编译错误 我尝试使用谷歌搜索此错误,但在任何地方都找不到有关此确切错误的任何讨论,因此我想我会将其发布到堆栈交换中。 有人可以解释这是什么类型的错误吗?class1和class2都非常简单:都只有一个构造函数方法,在两种情况下都将JSO