vasilka
Зарегистрирован: 28.03.2006 Сообщения: 1
|
Добавлено: Вт Мар 28 2006 12:31 Заголовок сообщения: блокировки |
|
|
Здравствуйте, коллеги. У нас появилаь ошибка, может Вы сможете помочь.
причиной ошибки является некорректная блокировка данных на SQL-сервере при параллельном выполнении двух запросов (в сегодняшнем примере - один элементарно простой запрос на UPDATE и очень сложный запрос на выборку по таблице MNT_LOG). Первоначальная гипотеза, что к блокировке приводят два запроса на изменение данных (UPDATE или INSERT) не подтвердилась - как оказалось, достаточно одного запроса на изменение данных (хотя по теории так НИКОГДА не должно быть!).
запрос типа "UPDATE <TABLE> SET … WHERE ID IN (SELECT ID FROM … <TABLE> …)
Ошибка проявляется в том, что SQL-сервер блокируется на одном из запросов, при этом загруженность сервера, сети и клиента нулевая (сервер и клиент ничего не делают, пакетов по сети нет). Блокируются сначала два запроса, вошедшие в конфликт, а потом и все остальные запросы на той же самой БД.
К сожалению, приходится констатировать, что подвисание вызвано ошибкой MS SQL, а не параметрами сети, ПО или аппаратуры. Увеличение мощности сервера снижает вероятность возникновения ошибки, но не гарантирует от нее. Предположительно, ошибка вызвана тем, что MS SQL не может полностью корректно распознать сложный запрос, в который входит более десятка таблиц и вьюшек, перекрывающихся между собой, и как следствие, не может сразу правильно расставить блокировки на таблицы.
Несмотря на то, что механизм возникновения ошибки примерно ясен, остались неразрешенный вопрос:
Почему ошибка проявляется на запросе на выборку, хотя этого никак не должно быть?
Поскольку ситуация является очевидной ошибкой MS SQL, возможно, существует Patch, ее исправляющий, или другое решение. При правильной реакции со стороны сервера блокированный процесс должен убиваться. В идеале хотелось бы добиться именно такого результата. _________________ hello |
|