Sybase ASE: «Ваша серверная команда обнаружила тупиковую ситуацию» - PullRequest
6 голосов
/ 10 июля 2009

При запуске хранимой процедуры (из приложения .NET), которая выполняет INSERT и UPDATE, я иногда (но не так часто, действительно) и случайно получаю эту ошибку:

ОШИБКА [40001] [DataDirect] [Драйвер ODBC Sybase Wire Protocol] [SQL Server] Ваша команда сервера (идентификатор семейства № 0, идентификатор процесса № 46) обнаружила ситуацию взаимоблокировки. Пожалуйста, повторите команду.

Как я могу это исправить?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 25 июля 2009

Лучшим решением для решения проблемы взаимоблокировки является включение «печати информации о взаимоблокировке» при использовании

sp_configure "вывод информации о взаимоблокировке", 1

Каждый раз, когда возникает тупик, он выводит информацию о том, какие процессы были задействованы и какие sql они выполняли во время мертвой блокировки.

Если в ваших таблицах используется блокировка всех страниц. Это может уменьшить взаимоблокировки при переключении на блокировку datarows или datapages. Если вы сделаете это, убедитесь, что вы собрали новую статистику в таблицах и воссоздали индексы, представления, хранимые процедуры и триггеры, которые обращаются к измененным таблицам. Если вы этого не сделаете, вы либо получите ошибки, либо не увидите всех преимуществ изменений в зависимости от того, какие из них не воссозданы.

2 голосов
/ 23 ноября 2009

У меня есть набор долгосрочных приложений, которые иногда выходят из-за доступа к коленям и sybase выдают эту ошибку Если вы проверите журнал сервера Sybase, он даст вам полную информацию о том, почему это произошло. Например: sql, в котором участвовали два процесса, пытающихся получить блокировку. Обычно один пытается читать, а другой делает что-то вроде удаления. В моем случае приложения выполняются в отдельных JVM, поэтому синхронизировать их нельзя, просто нужно периодически очищать.

0 голосов
/ 11 июля 2009

Предполагая, что ваши таблицы правильно проиндексированы (и что вы на самом деле используете эти индексы - всегда стоит проверять с помощью плана запросов), вы можете попробовать разбить составные части SP и обернуть их в отдельные транзакции, чтобы каждая единица работа завершена до начала следующего.

 begin transaction 
   update mytable1 
     set mycolumn = "test"
   where ID=1

 commit transaction
 go

 begin transaction 
  insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1
 commit transaction
 go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...