MSSQLSERVER_3617

适用范围:SQL Server

详细信息

Attribute
产品名称 SQL Server
事件 ID 3617
事件来源 MSSQLSERVER
组件 SQLEngine
符号名称 SYS_ATTN
消息正文

说明

当应用程序或用户取消了执行过程中的查询或该连接中断时,将引发错误 3617。 应用程序中的此查询取消导致数据库引擎中发生 Attention 事件。 Attention 事件是一个 SQL Server 事件,用于注册客户端应用程序终止查询执行的请求。 可以使用扩展事件或 SQL 跟踪 关注事件类跟踪 SQL Server 端的 Attention 事件。 Attention 在内部显示为错误 3617。

注意(查询取消)是 SQL Server 处理的最常用 TDS 事件 之一。 当查询取消请求到达时,会为会话/请求设置 Attention 位。 随着会话处理暂停点,会选取并遵循 Attention。 如需详细了解 Attention 及其与其他组件的相互影响,请参阅任务、工作器、线程、计划程序、会话、连接、请求;这些是什么含义?

用户作

原因摘要:

原因 Description
确保查询在预期持续时间内完成(小于配置的查询超时值) 引起注意事件的最常见原因是,由于超出查询超时值,应用程序会自动终止查询。 如果查询/命令超时值设置为 30 秒,并且查询甚至不会将单个数据包返回给客户端应用程序,则后者将取消查询。 在这种情况下,最好的方法是了解查询花费很长时间的原因,并采取适当的措施来减少查询持续时间。
增加查询或命令超时 如果确定取消的查询在预先建立的基线持续时间内运行,但仍会达到命令超时,则可以考虑增加数据库应用程序中的超时值。
了解用户是否手动取消了查询执行 在某些情况下,可能只是因为用户取消了查询而引发注意事件。 在这种情况下,最好确定用户的期望是否超过查询的实际速度,并通过优化查询或记录预期基线来解决这些情况。
了解应用程序或 OS 是否意外终止了查询或连接,或者应用程序本身是否已终止 调查情况以了解应用程序端发生的情况。 检查应用程序日志或系统日志可能会提供有关可能的根本原因的线索。

注意和事务

通常情况下,当应用程序达到查询超时并取消查询时,将引发 Attention 事件。 发生 Attention 事件时,SQL Server 不会自动回滚打开的事务。 应用程序负责回退事务,有几种常见的处理方法:

  • 通过在连接到 SQL Server 时启用 SET XACT_ABORT 来控制事务回滚。 如果应用程序未执行此作,则孤立的事务结果。

  • 更常见的情况是,应用程序使用 try.. catch... finally 处理任何错误。 在 try 块中,打开事务,如果发生错误,请在 catch 或 finally 块中回滚事务。

下面是一个示例:

using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
    SqlTransaction transaction;
    SqlCommand command = connection.CreateCommand();

    connection.Open();
    transaction = connection.BeginTransaction("UpdateTran_Routine1");

    command.Connection = connection;
    command.Transaction = transaction;

    try
    {
        //update one of the tables
        command.CommandText = "update dl_tab1 set col1 = 987";
        command.ExecuteNonQuery();
        transaction.Commit();
    }

    catch (SqlException ex)
    {
        // Attempt to roll back the transaction.
        try
        {
            transaction.Rollback();
        }
        catch (Exception ex2)
        {
            // This catch block will handle any errors that may have occurred
            // on the server that would cause the rollback to fail, such as
            // a closed connection.
            Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
            Console.WriteLine("  Message: {0}", ex2.Message);
        }
    }
}