SQL Server 2005 блокируется без заблокированных или блокирующих процессов - PullRequest
2 голосов
/ 20 декабря 2009

У нас есть база данных (назовем ее базой данных A), которая становится непригодной к использованию каждые несколько дней, и мы должны перезапустить ее. Когда я говорю «непригодный», это означает, что все приложения, использующие его, просто блокируются, ожидая ответа от базы данных, но это никогда не происходит.

К счастью, было замечено, что выполнение оператора SELECT для определенной таблицы с использованием SQL Server Management Studio, похоже, приносит некоторые записи, но в какой-то момент блокируется.

Самое смешное, что в конкретной базе данных нет процессов LOCKED или LOCKING. Я обнаружил, что приложение использует следующую изоляцию транзакции:

ALLOW_SNAPSHOT_ISOLATION ON

что объясняет, почему мы не можем видеть процессы Locked или Locking, верно?

У нас есть другая база данных (назовем ее базой данных B), которая фактически имеет ту же схему, и у нас никогда не было этой проблемы. Единственная разница между этими базами данных - это изоляция, о которой я упоминал ранее. Этот использует изоляцию транзакции по умолчанию, и у нас никогда не было этой странной вещи блокировки базы данных. Но и в базе данных А гораздо больше транзакций, открываемых в день; намного намного больше Так что я могу думать о том, что в этом случае следует избегать ИЗОЛЯЦИИ SNAPSHOT для большого числа одновременных транзакций.

Может ли кто-нибудь подтвердить, что, скорее всего, именно SNAPSHOT ИЗОЛЯЦИЯ вызывает проблемы? Я имею в виду, что у нас нет блокировок, и у нас просто есть блокировка базы данных без каких-либо реальных исключений или что-то, что поможет нам определить основную причину проблемы.

Верны ли мои предположения? Я очень на это надеюсь.

1 Ответ

2 голосов
/ 20 декабря 2009

Вы пытались контролировать использование tempdb? (AFAIK, ALLOWSNAPSHOT_ISOLATION ON в значительной степени зависит от базы данных tempdb, чего нельзя сказать о стандартных стратегиях блокировки)

Эта страница MS Technet дает несколько советов, как это сделать (см. Раздел «Пространство мониторинга»)

Вы также можете использовать этот быстрый запрос, чтобы проверить, что ваша база данных tempdb не заполнена:

   use tempdb
   exec sp_spaceused
...