これがMSSQLサーバーであると仮定すると、おそらくUPDLOCK
が必要になります。 、おそらくROWLOCK
と組み合わせる (表のヒント
)。理論を説明するまともな記事を見つけるのに苦労していますが、ここに簡単な例があります:
SELECT id From mytable WITH (ROWLOCK, UPDLOCK) WHERE id = 1
このステートメントは、更新ロック
を配置します。 トランザクションの期間中、行に表示されます(したがって、トランザクションがいつ終了するかを知っておくことが重要です)。更新ロックは
このレコードを変更しようとする他のプロセスは、トランザクションが完了するまでブロックされますが、トランザクションが終了すると、要求された書き込み操作は続行されます(タイムアウトするか、デッドロックプロセスとして強制終了されない限り)。これを防ぎたい場合は、互換性のないロックが検出された場合に中止するか、変更された場合にレコードをスキップするために、他のプロセスで追加のヒントを使用する必要があります。
また、ユーザー入力を待っている間は、このメソッドを使用してレコードをロックしないでください 。これが意図している場合は、代わりに何らかの「変更中」列をテーブルに追加する必要があります。
SQLサーバーのロックメカニズムは、実際にはデータの整合性を維持し、デッドロックを防止するためにのみ使用できます。トランザクションは通常、できるだけ短く維持する必要があります。 また、ユーザー入力を待っている間は維持しないでください。