2009-03-24 11 views
2

特定のタスクを実行する前に、特定のフラグがDBに設定されているかどうかをチェックし、設定されていない場合は処理の残りが完了し、設定されています。今、2つの異なるトランザクションからの同時アクセスの場合、最初のトランザクションがフラグをチェックして設定されていない場合、それはさらに進む。同時に、2番目のトランザクションがフラグをチェックするのを制限したい、すなわち、そのトランザクションがSELECTクエリを実行することを制限したいと思って、最初のトランザクションがその処理を完了してフラグをセットした後で同じトランザクションを実行できるようにしたい。SQL Server 2005でSELECTステートメントを制限する

ロック/ヒントを使用してDBレベルで実装したいと考えました。しかし、ヒントはSELECTクエリを制限するものではなく、分離レベルの制限には向かない。

答えて

2

あなたの旗を保護するためにApplication Lockを作成することができますので、2番目のトランザクションは、SELECTを実行するかのフラグにアクセスすることは、アプリケーションのロックに

1

私は、SQL Server 2005がネイティブにダーティリードを許可しないことでこれを行うと信じています。つまり、私が理解するように、2番目のユーザーがフラグをチェックするためにselectを実行しようとする前に更新/挿入が行われる限り、dbはselectを処理する前に更新/挿入がコミットされるのを待ちます。

さらに細かくしたい場合は、common locksもあります。

編集:XLOCKも何らかの助けになるかもしれません。そして、トランザクションでSQLをラップすることも同様に役立ちます。

0

を取得できない場合は、両方のタスクを行うストアドプロシージャを試みることができるか、などはありません異なるタスク(プロキシのようなもの)を行う2つの異なるストアドプロシージャのエントリポイント。

ストアドプロシージャはSQL Serverのモニタなので、並行性を管理するアーティファクト(実行したいもの)です。

0

SP /コードでトランザクションを開始し、フラグを更新するだけで済みます。それは他のユーザーが(コミットされていないと読んでいない限り)それを読むのを妨げます。

コミットされていない場合は、更新トランザクションで排他ロックを設定します。

関連する問題