2012-05-08 3 views
2

У нас есть сценарий:SQL Server 2008 - добавление столбца реплицированной таблицы не удается

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

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

You can only specify the READPAST lock in the READ COMMITTED or REPEATABLE READ isolation levels

Вопросы:

  • Что вызывает проблему?
  • Как это исправить?

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

ответ

1

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

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

For example, assume table T1 contains a single integer column with the values of 1, 2, 3, 4, 5. If transaction A changes the value of 3 to 8 but has not yet committed, a SELECT * FROM T1 (READPAST) yields values 1, 2, 4, 5.

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

+0

Я не использую READPAST в sproc, я считаю, что это материал репликации. –

+0

readpast в порядке с READ COMMITTED. Что-то в вашем процессе меняет уровень изоляции на чтение незафиксированного типа – Diego

1
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

+0

но почему я должен это делать? он по-прежнему ПРОЧИТАЕТ ОБЯЗАТЕЛЬНО, не так ли? –

+0

Потому что вы используете alter. С помощью ALTER вы должны вручную указать УРОВЕНЬ ИЗОЛЯЦИИ. – broguyman

+0

READ COMMITTED по умолчанию используется в SQL SERVER 2008, но, по-видимому, ему все же не нравится подсказка READPAST. Вы должны установить его вручную или убедиться, что для READ_COMMITTED_SNAPSHOT установлено значение ON. – broguyman

1

Вы уверены, что уровень изоляции установлен в READ COMMITTED?

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

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