2015-04-03 2 views
0

Это будет первое из самых странных вещей, которые я видел. Я пробовал искать «простой t-sql delete, вызывая таймаут», но все заголовки вводят в заблуждение, говорят простые, но нет. Они занимаются удалением миллионов записей или установкой сложных отношений. Я не.Абсолютный самый простой оператор T-SQL DELETE, вызывающий тайм-аут

У меня есть четыре таблицы:

tblInterchangeControl, tblFunctionalGroup, tblTransactionSet, tblSegment

Последние 3 все адъюнкт к tblInterchangeConrol через InterchangeControlID. Настройка отношений отсутствует. как я сказал так просто, как можно было получить.

Процедура выполняет ВЕЬЕТЕ на всех 4-х таблиц, как так ...

DELETE FROM tblSegment 
WHERE (ID_InterchangeControlID = @InterchangeControlID) 

DELETE FROM tblTransactionSet 
WHERE (ID_InterchangeControlID = @InterchangeControlID) 

DELETE FROM tblFunctionalGroup 
WHERE (ID_InterchangeControlID = @InterchangeControlID) 

DELETE FROM tblInterchangeControl 
WHERE (InterchangeControlID = @InterchangeControlID) 

Странная часть, если я оставлю их в порядке времени ожидания, если удалить их, это не так. Я привязал его к этим операциям удаления, которые являются причиной. Но почему?!

Я включил C#, потому что я вызываю эту процедуру из приложения C#. Я не думаю, что это проблема, но, может быть. Я только говорю, что я так не думаю, потому что мой код работает нормально, когда я удаляю инструкции delete внутри хранимой процедуры. Затем, если я верну их, возникает исключение, которое было отключено.

+2

Скорее всего, у вас есть блокировки, удерживающие это. – Paparazzi

+0

Snap Я думаю, что ты прав. Я не обязательно сталкивался с проблемами блокировки. Это все происходит в цикле, который создает записи, которые я также пытаюсь удалить, вставка находится в транзакции, а удаление - нет. Я думаю, мне придется немного переработать, чтобы заставить это работать. Я отправлю отчет, как только сделаю некоторый прогресс или получаю больше информации. –

+0

Почему у вас нет каких-либо отношений? Кажется мне, что это было бы хорошим местом, чтобы иметь внешние ключи с каскадным удалением? В качестве побочного примечания ваши соглашения об именах кажутся мне немного странными. Почему ID_InterchangeControlID? И почему префиксы tbl на всех ваших таблицах? –

ответ

0

Если вы запустите запрос из инструмента командной строки SQL или из SQL Management Studio, он выполнит все необходимое для завершения запроса. Так что да, скорее всего, это проблема с клиентской частью. И, поскольку вы упомянули C#, это, вероятно, ADO.NET command timeout.

Кроме того, я бы предложил просмотреть запросы, проверив их планы выполнения. Если у вас нет индексов (первичные/уникальные ограничения ключей), это приведет к полной проверке, т. Е. Операции O (n), которую вы не хотите.

Обновление: ОК, похоже, что это ошибка ADO.NET. В вашем коде, как раз перед выполнением команды, увеличьте время ожидания:

var myCommand = new SqlCommand("EXEC ..."); // you create it something like this 
.... 
myCommand.CommandTimeout = 300; // 5 minutes 
myCommand.ExecuteNonReader(); // assuming your SP doesn't return anything 
+0

Это исключение, которое я получаю (это также занимает минуту, а не 30 секунд для таймаута команды): Истекло время ожидания. Период ожидания истекает до завершения операции или сервер не отвечает. Заявление было прекращено. Внутреннее исключение: Ожидаемая операция ожидания –

+0

Где находится SQL-сервер, к которому вы обращаетесь? На вашей локальной машине? –

+0

Да. Но теперь я считаю, что это была проблема блокировки. Я забыл, где я пытался придерживаться этого заявления на удаление. Так получилось, что вставка произошла отдельно от транзакции. Удалить не было. Я добавил оператор delete для транзакции и альта! это сработало. –

3

В случае, если мой комментарий является ответом.
Скорее всего, у вас есть блокировки, содержащие эти удаления.

+0

Спасибо, я просто собирался добавить это и дать вам кредит. Транзакция, в которую вставлены записи, заключалась в блокировке выделенного удаления от удаления тех же записей. –

+0

@DavidCarrigan Вы можете нажать кнопку «Проверить», чтобы принять ответ – Paparazzi

Смежные вопросы