SQL Server 2008-добавление столбца в реплицированную таблицу завершается ошибкой


У нас есть сценарий:

  • SQL Server 2008
  • у нас есть репликация в БД
  • у нас есть простой sproc, который выполняет ALTER одной из таблиц (add new column)
  • уровень изоляции по умолчанию (READ COMMITTED)

Хранимая процедура завершается ошибкой:

Вы можете только указать блокировку READPAST в уровнях изоляции Read COMMITTED или REPEATABLE READ

Вопросы:

  • в чем причина проблемы?
  • Как это сделать? исправить это?

Обновление: Я считаю, что это очень распространенная проблема, поэтому мне интересно, почему нет хороших объяснений, почему репликация вызывает эту проблему

3 2

3 ответа:

Вы не можете указать READPAST только при чтении из зафиксированных данных.

Причина в том, что readpast игнорирует заблокированные строки, поэтому, когда вы используете его, вы в значительной степени говорите sql server, дайте мне все, что не было затронуто никакой другой транзакцией. Пример из бол:

Например, предположим, что таблица T1 содержит один целочисленный столбец с ценности 1, 2, 3, 4, 5. Если транзакция А изменяет значение от 3 до 8 но еще не совершил, a SELECT * FROM T1 (READPAST) дает значения 1, 2, 4, 5.

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

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
//REST OF QUERY ADD WITH (READPAST) after the table names Ex. SELECT FOO.* FROM dbo.foobar FOO WITH (READPAST)

И / или это должно помочь вам.

Http://support.microsoft.com/kb/981995

Вы уверены, что уровень изоляции Read совершил?

Я видел эту ошибку, когда изоляция установлена в serializable и вы используете ALTER TABLE на таблице, опубликованной для репликации. Это связано с тем, что некоторые хранимые процедуры репликации используют подсказку READPAST, чтобы избежать блокировки, которая может использоваться только на уровнях изоляции Read COMMITTED или REPEATABLE READ.

Если вы уверены, что уровень изоляции установлен на чтение COMMITTED, то я бы рекомендовал связаться с Microsoft PSS по этому вопросу одного как не должно было случиться. Они смогут помочь вам лучше.