【问题标题】:ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION following SQL Server Error 8114在 SQL Server 错误 8114 之后,ROLLBACK TRANSACTION 请求没有相应的 BEGIN TRANSACTION
【发布时间】:2017-06-30 03:38:59
【问题描述】:

我正在用 C++ 编写一个 SQL Server 数据库。我有一个名为SQLTransaction 的对象,当它在代码块的开头创建时,它会将“开始事务”发送到 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 会自动回滚一些错误吗?我真的很想了解这里发生了什么。

谢谢

【问题讨论】:

  • 为什么不能把事务逻辑放在SQL语句里面?

标签: sql-server transactions


【解决方案1】:

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

可以设置选项:

  1. 在连接级别上;
  2. 不同的数据库访问驱动程序可能有不同的默认连接选项;
  3. SQL Server 实例级别有一个默认值。

检查最近是否有任何更改。此外,如果您在 SQL Profiler 中捕获跟踪,“ExistingConnection”事件会列出当前连接设置。您可以随时检查那里的选项状态,如果它已关闭,则将其排除。在这种情况下,我会仔细查看跟踪,可能会有其他命令发送到服务器,而这些命令在您的客户端代码中并不明显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多