Серверная таблица Sql может быть запрошена, но не обновлена - PullRequest
3 голосов
/ 03 марта 2010

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

я пытался использовать

select req_transactionUOW
from master..syslockinfo
where req_spid = -2

чтобы проверить, не блокировала ли какая-либо потерянная транзакция таблицу, но не вернула результатов.

Я не могу найти признаки того, что моя таблица заблокирована, но просто не могу ее обновить. какие-либо подсказки относительно того, как исправить таблицу или в каком она состоянии?

Ответы [ 6 ]

1 голос
/ 20 марта 2010

Когда вы говорите «Тайм-аут», оно достигает тайм-аута клиента? Например, время ожидания команды .net по умолчанию составляет 30 секунд. Я бы предложил увеличить это значение до очень большого или запустить обновление в инструментах SQL (по умолчанию время ожидания не установлено).

Кроме этого, обновление закончится в определенный момент или произойдет ошибка и откат: у вас достаточно времени?

Существует также блокировка, последнее перестроение индекса, последнее обновление статистики, триггеры, случайное перекрестное соединение, рост файла MDF или LDF, плохой ввод-вывод, разбиение на страницы ОС ... и т. Д. Вы перезапустили экземпляр или сервер SQL, чтобы удалить экологические проблемы и уничтожение всех других соединений?

Просто недостаточно информации, чтобы выносить суждение, извините.

0 голосов
/ 22 апреля 2010

Можете ли вы обновить другие таблицы? Если нет (или в любом случае, если хотите), вы можете проверить, заполнен ли журнал транзакций (если вы используете модель полного восстановления) / раздел, в котором находится ваш журнал транзакций, заполнен. Я думаю, что если SQL Server не может записать в журнал транзакций, вы бы / могли испытать такое поведение.

DBCC будет вашим другом: DBCC SQLPERF(LOGSPACE) показывает, сколько (в процентах) вашего журнала используется. Если это (близко к) 100%, это может быть вашей проблемой.

Только мои две копейки стоит.

0 голосов
/ 15 марта 2010

У вас есть триггеры на столе? Если это так, возможно, сбой триггера, поэтому обновление невозможно.

0 голосов
/ 03 марта 2010

Если вы подозреваете блокировку, я бы первым делом запустил sp_lock. Это даст вам список всех текущих удерживаемых блокировок. Вы можете использовать функции DB_NAME и OBJECT_NAME, чтобы получить имена, соответствующие столбцам dbid и ObjId.

0 голосов
/ 03 марта 2010

Не могли бы вы оформить этот запрос:

SELECT  COUNT(*)
FROM    mytable WITH (UPDLOCK, READPAST)

, который пропустит заблокированные записи и убедится, что возвращает то же количество записей, что и

SELECT  COUNT(*)
FROM    mytable

Возможно, вам придется повторять его при каждом принудительном индексировании таблицы, чтобы убедиться, что никакие ресурсы индекса не заблокированы.

0 голосов
/ 03 марта 2010

Я предполагаю, что это не проблема с разрешениями, поскольку вы не получаете сообщение об ошибке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...