SQL Server 2008 читает блокирует записи - PullRequest
1 голос
/ 04 августа 2009

Я обновил набор баз данных с SQL Server 2000 до SQL Server 2008, и теперь большие операции чтения блокируют записи, тогда как в SQL Server 2000 это не было проблемой (те же базы данных и те же приложения и отчеты) Почему? Какие настройки в 2008 году отличаются? 2000 по умолчанию для чтения незафиксированных транзакций?

(обновление) Добавление с (nolock) к рассматриваемым представлениям отчетов устраняет проблему в краткосрочной перспективе - в долгосрочной перспективе нам придется делать копии данных для отчетов либо со снимками, либо вручную. [вздох] Я все еще хотел бы знать, что в SQL Server 2008 делает это необходимым.

(обновление 2) Поскольку рассматриваемые представления используются только для отчетов, «чтение без передачи» должно быть нормальным.

Ответы [ 4 ]

2 голосов
/ 04 августа 2009

SQL Server 2000 не использовал READ UNCOMMITTED по умолчанию, нет.

Возможно, это связано с изменениями в оптимизации в плане выполнения. Некоторые индексы, вероятно, заблокированы в порядке, отличном от того, который был в SQL Server 2000. Или SQL Server 2008 использует индекс, который SQL Server 2000 полностью игнорировал для этого конкретного запроса.

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

1 голос
/ 05 августа 2009

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

http://msdn.microsoft.com/en-us/library/ms189050.aspx

1 голос
/ 04 августа 2009

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

1 голос
/ 04 августа 2009

Read Committed - уровень изоляции по умолчанию в SQL Server 2000, а не Read Uncommitted.

http://msdn.microsoft.com/en-us/library/aa259216(SQL.80).aspx

Я предполагаю, что что-то в вашем приложении устанавливало уровень изоляции - возможно, через одно из свойств объекта подключения. Посмотрите здесь методы, используемые для установки уровней изоляции транзакций через ADO, ODBC и OLE DB.

Вы можете сделать то же самое в SQL Server 2008, но ... вы уверены, что ваше приложение должно работать в режиме чтения без передачи? Ваше приложение специально разработано для обработки данных и фантомного чтения?

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