データベース テーブルが MSSQL 2005 のキューとして使用される小規模なシステムがあります。いくつかのアプリケーションがこのテーブルに書き込みを行っており、1 つのアプリケーションが FIFO 方式で読み取りと処理を行っています。
複数の処理アプリケーションを実行できる分散システムを作成できるようにするには、もう少し高度にする必要があります。その結果、2 ~ 10 個の処理アプリケーションが実行可能になり、作業中に互いに干渉することはありません。
私の考えは、プロセスが既に処理中であることを示す行でキュー テーブルを拡張することです。処理アプリケーションは、最初にその識別子を使用してテーブルを更新し、次に更新されたレコードを要求します。
だから、このようなもの:
start transaction
update top(10) queue set processing = 'myid' where processing is null
select * from processing where processing = 'myid'
end transaction
処理後、テーブルの処理列を「完了」などの別の値に設定します。
このアプローチについて 3 つの質問があります。
最初:これはこの形で機能しますか?
第二に、それが機能している場合、それは効果的ですか? そのようなディストリビューションを作成するための他のアイデアはありますか?
3 番目: MSSQL では、ロックは行ベースですが、一定量の行がロックされると、ロックはテーブル全体に拡張されます。したがって、最初のアプリケーションがトランザクションを解放しない限り、2 番目のアプリケーションはそれにアクセスできません。テーブル全体をロックせず、行ロックのみを作成するには、選択範囲 (トップ x) をどのくらいの大きさにできますか?