MSSQLSERVER_3617
适用于:SQL Server
详细信息
属性 | 值 |
---|---|
产品名称 | 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);
}
}
}