ROLLBACK TRANSACTION请求在SQL Server错误8114之后没有对应的BEGIN TRANSACTION

时间:2017-02-11 23:02:48

标签: sql-server transactions

我正在用C ++编写SQL Server数据库。我有一个名为SQLTransaction的对象,当在代码块的开头创建时,发送' begin transaction'到SQL Server。

然后我将一个或多个SQL语句发送到服务器。如果一切顺利,我在SQLTransaction对象中设置一个标志,让它知道命令集顺利。当SQLTransaction对象超出范围时,它会发送提交事务'或者'根据标志的状态回滚事务到服务器。

它看起来像这样:

    {
        TSQLTransaction SQLTran();

        try
        {
            Send( SomeSQLCommand );
        }
        catch(EMSError &e)
        {
            InformOperator();
            return;
        }

        SQLTran.commit();  
    }

我在其中一个块中发送了一条SQL语句,发送了一个糟糕的命令,并且该命令引发了SQL错误8114

  

将数据类型varchar转换为数字

时出错

我已经解决了这个问题。我不明白的事实是我还收到了第二条SQL错误消息

  

ROLLBACK TRANSACTION请求没有相应的BEGIN TRANSACTION。

我无法找到任何告诉我此事务在失败后可以或不应该回滚的事情。

这个完全相同的SQLTransaction对象在我的应用程序的许多地方使用,并且似乎总是正常工作到现在为止。出于某种原因,这个SQL错误似乎被区别对待。是否存在SQL Server自动回滚的错误?我真的很想了解这里发生了什么。

由于

1 个答案:

答案 0 :(得分:0)

有一个连接选项SET XACT_ABORT,它确定SQL语句抛出错误时当前事务的命运。基本上,当设置为OFF时,事务(通常)会存活并继续执行;如果它是ON,则回滚当前连接中所有已打开的事务并终止批处理。

可以设置选项:

  1. 在连接级别;
  2. 不同的数据库访问驱动程序可能具有不同的连接选项默认值;
  3. SQL Server实例级别上有一个默认值。
  4. 检查最近是否有任何改变。此外,如果您在SQL事件探查器中捕获跟踪,那么" ExistingConnection"事件列出当前连接设置。您可以随时检查选项状态,并在关闭时将其排除在外。在这种情况下,我会仔细查看跟踪,可能会有其他命令发送到服务器,这些命令从您的客户端代码中显而易见。