MSSQLSERVER_3617

適用於:SQL Server

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 3617
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 SYS_ATTN
訊息文字

說明

當應用程式或使用者取消執行中間的查詢,或連線中斷時,就會引發錯誤 3617。 從應用程式取消此查詢會導致 Database Engine 中發生 Attention 事件。 Attention 事件是一個 SQL Server 事件,會註冊用戶端應用程式終止查詢執行的要求。 您可以使用擴充事件或 SQL 追蹤 注意事件類別 ,追蹤 SQL Server 端的 Attention 事件。 注意會在內部顯示為錯誤 3617。

注意(查詢取消)是 SQL Server 處理的最常用 TDS 事件 之一。 當查詢取消要求送達時,會為會話/要求設定注意位。 當會議過程產生點時,人們會得到注意並受到尊重。 如需有關注意的一些詳細資訊,以及它們與其他元件之間的互動方式,請參閱 工作、背景工作、執行緒、排程器、會話、連線、要求;這一切都是什麼意思?

使用者動作

原因摘要:

  • 確保查詢在預期的持續時間內完成(小於設定的查詢逾時值)
  • 增加查詢或命令逾時
  • 瞭解使用者是否已手動取消查詢執行
  • 瞭解應用程式或 OS 是否意外終止

確保查詢在預期的持續時間內完成(小於設定的查詢逾時值): 最常見的注意原因是應用程式因為超過查詢逾時值而自動終止查詢。 如果查詢/commmand 逾時值設定為 30 秒,而且查詢甚至不會將單一資料封包傳回用戶端應用程式,後者會取消查詢。 在這種情況下,最佳方法是瞭解查詢花費這麼長時間的原因,並採取適當的步驟來減少其持續時間。

增加查詢或命令逾時: 如果您建立已取消的查詢是在預先建立的基準持續時間內執行,但仍達到命令逾時,您可以考慮增加資料庫應用程式中的逾時值。

找出使用者是否手動取消查詢執行: 在某些情況下,可能會因為使用者取消查詢而引發注意事件。 在這種情況下,最好確定使用者的期望是否超過查詢的實際速度,並藉由微調查詢或記錄預期的基準來解決這些情況。

找出應用程式或 OS 是否意外終止查詢或連線,或應用程式本身是否已終止: 調查情況以瞭解應用程式端發生的情況。 檢查應用程式記錄或系統記錄可能會提供可能根本原因的線索。

注意和交易

通常,當應用程式達到查詢逾時並取消查詢時,就會引發注意事件。 發生 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);
        }
    }
}