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);
        }
    }
}