2

シナリオがあります:

  • SQL Server 2008
  • データベースにレプリケーションがあります
  • テーブルの1つのALTERを実行する単純なsprocがあります(新しい列を追加します)
  • 分離レベルはデフォルトです(READ COMMITTED)

ストアドプロシージャはエラーで失敗します:

READPASTロックは、READCOMMITTEDまたはREPEATABLEREAD分離レベルでのみ指定できます。

質問:

  • 問題の原因は何ですか?
  • それを修正する方法は?

更新: これは非常に一般的な問題だと思うので、レプリケーションがこの問題を引き起こす理由についての適切な説明がないのはなぜだろうか

4

3 に答える 3

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

于 2012-05-08T15:11:39.120 に答える
1

コミットされたデータから読み取る場合にのみREADPASTを指定することはできません。

理由は、readpastがロックされた行を無視するためです。したがって、readpastを使用するときは、他のトランザクションによって影響を受けていないすべてのものをSQLServerに提供してください。BOLの例:

たとえば、テーブルT1に値が1、2、3、4、5の単一の整数列が含まれているとします。トランザクションAが値を3から8に変更したが、まだコミットしていない場合、SELECT * FROM T1(READPAST)は次のようになります。値1、2、4、5。

読み取りのコミットされていない分離レベルでは、デフォルトでコミットされていない値が返されると言っても意味がありません。そのちょっと2つの反対のことを要求します。

于 2012-05-08T15:17:46.387 に答える
1

分離レベルがREADCOMMITTEDに設定されていますか?

分離がシリアル化可能に設定されていて、レプリケーション用に公開されたテーブルでALTER TABLEを使用すると、このエラーが発生します。これは、一部のレプリケーションストアドプロシージャがREADPASTヒントを使用して、READCOMMITTEDまたはREPEATABLEREAD分離レベルでのみ使用できるブロッキングを回避するためです。

分離レベルがREADCOMMITTEDに設定されていることが確実な場合は、これが発生しないはずなので、これについてMicrosoftPSSに連絡することをお勧めします。彼らはあなたをよりよく助けることができるでしょう。

于 2012-05-08T16:30:59.153 に答える