2012-05-08 18 views
2

我々は持っているシナリオ:SQL Server 2008の - レプリケート表に列を追加するには、失敗し

  • SQL Serverの我々はの一つでALTERを実行し、簡単なSPROCを持って
  • デシベルでレプリケーションを持っ2008
  • テーブル(新しい列を追加するには)
  • 分離レベルがデフォルト(COMMITTED READ)

ストアドプロシージャはエラーで失敗している:

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

質問:

  • 問題の原因は何?
  • これを修正するにはどうすればよいですか?

UPDATE: 私は、これは複製が

答えて

1

コミットされたデータから読み込むときだけREADPASTを指定傾けます。

なぜなら、readpastはロックされた行を無視するからです。使用すると、他のトランザクションで触れられていないすべてのものをSQL Serverに渡すことになります。 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.

これは、デフォルトでは、コミットされていない値を戻します読んUNCOMMITTED分離レベル、上のことを言ってあまり意味がdoesntの。その2つの反対のことを要求します。

+0

私はsprocでREADPASTを使用しません、私はそれが複製のものだと信じています –

+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

ですが、なぜこれを行う必要がありますか?それは既定ですでにREAD COMMITTEDです、そうではありませんか? –

+0

あなたはalterを使用しているためです。 ALTERでは、ISOLATION LEVELを手動で指定する必要があります。 – 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に連絡することをお勧めします。彼らはあなたをより良く助けることができます。

関連する問題