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 及其与其他组件的相互影响,请参阅任务、工作器、线程、计划程序、会话、连接、请求;这些是什么含义?

用户操作

原因摘要:

  • 确保查询在预期持续时间内完成(小于配置的查询超时值)
  • 增大查询或命令超时
  • 查看用户是否已手动取消查询执行
  • 查明应用程序或操作系统是否意外终止

确保查询在预期持续时间内完成(小于配置的查询超时值): Attention 事件的最常见原因是由于超过查询超时值,导致应用程序自动终止查询。 如果查询/命令超时值设置为 30 秒,并且该查询不会将任何数据包返回给客户端应用程序,则后者将取消查询。 在这种情况下,最好的方法是了解查询花费很长时间的原因,并采取适当的措施来减少查询持续时间。

增大查询或命令超时值: 如果确定已取消的查询正在预先确定的基准持续时间内运行,但仍达到命令超时,则可以考虑在数据库应用程序中增大超时值。

查看用户是否手动取消了查询执行: 在某些情况下,可能只是因为用户取消了查询而引发 Attention 事件。 在这种情况下,最好是确定用户期望是否超过查询的实际速度,通过调整查询或记录预期基线来解决此问题。

查明应用程序或操作系统是否意外终止了查询或连接,或应用程序本身是否已终止: 调查情况以了解应用程序端发生了什么情况。 检查应用程序日志或系统日志可提供可能的根本原因线索。

Attention 和事务

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

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

  • 更常见的情况是,应用程序使用 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);
        }
    }
}