Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Область применения:SQL Server
Сведения
| Атрибут | Значение |
|---|---|
| Название продукта | SQL Server |
| ИД события | 3617 |
| Источник событий | MSSQLSERVER |
| Компонент | SQLEngine |
| Символическое имя | SYS_ATTN |
| Текст сообщения |
Описание
Ошибка 3617 возникает, когда приложение или пользователь отменяет выполняющийся сейчас запрос либо когда подключение прерывается. Отмена запроса из приложения вызывает событие Attention в ядре СУБД. Событие "Внимание" — это событие SQL Server, которое регистрирует запрос клиентского приложения для завершения выполнения запроса. Вы можете отслеживать событие "Внимание" на стороне SQL Server с помощью класса расширенных событий или класса событий внимания трассировки SQL. Внутри системы события Attention отображаются как ошибка 3617.
Внимание (отмена запросов) является одним из наиболее распространенных событий TDS, обрабатываемых SQL Server. Когда приходит такой запрос, для сеанса и запроса задается соответствующий бит. Этот бит сканируется и учитывается по мере обработки сеансом точек приостановки. Некоторые дополнительные сведения о событиях Attention и их взаимодействии с другими компонентами см. в статье Tasks, Workers, Threads, Scheduler, Sessions, Connections, Requests ; what does it all mean? (Задачи, рабочие потоки, потоки, планировщик, сеансы, подключения, запросы: что все это означает?)
Действие пользователя
Сводка причин:
| Причина | Description |
|---|---|
| Убедитесь, что запросы выполняются в течение ожидаемой длительности (меньше настроенного значения времени ожидания запроса) | Наиболее распространенной причиной событий внимания является автоматическое завершение запросов приложением из-за превышения значений времени ожидания запроса. Если для запроса или времени ожидания команды задано значение 30 секунд, и запрос не возвращает даже один пакет данных обратно в клиентское приложение, последний отменит запрос. В таких случаях имеет смысл проанализировать, почему запрос занимает столько времени, и принять меры по его ускорению. |
| Увеличение времени ожидания запроса или команды | Если установить, что отмененный запрос выполняется в течение предустановленной базовой длительности, но время ожидания команды по-прежнему достигнуто, может потребоваться увеличить значение времени ожидания в приложении базы данных. |
| Узнайте, отменили ли пользователи выполнение запроса вручную | В некоторых случаях событие внимания может вызываться просто потому, что пользователь отменил запрос. В таких случаях может оказаться разумным установить, превышает ли ожидания пользователей фактическую скорость запроса и устранить их, настроив запрос или задокументируя ожидаемый базовый план. |
| Узнайте, завершило ли приложение или ОС неожиданное завершение запроса или подключения или если само приложение завершилось | Изучите ситуацию, чтобы понять, что происходит в конце приложения. Изучение журналов приложений или системных журналов может дать подсказки по возможной первопричине. |
Внимание и транзакции
Как правило, события Attention возникают, когда время ожидания запроса в приложении истекает и приложение отменяет запрос. При возникновении события внимания SQL Server не автоматически откатывает открытые транзакции. Откат транзакции является обязанностью приложения, и для него есть два стандартных способа:
Контроль отката транзакций путем включения set XACT_ABORT при подключении к SQL Server. Если приложение не делает этого, результаты потерянных транзакций.
Чаще для обработки ошибок приложения используют
try.. catch... finally. В блокеtryвы открываете транзакцию и, если возникает ошибка, откат транзакции в блоке catch или, наконец, откат.
Ниже приведен пример:
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);
}
}
}