-1

キューとして機能する SQL テーブルがあります。

基本的に、未処理のアイテムを読み取り、それらのアイテムに応じて動作し、処理済みビットを設定するマルチスレッド プロセスがあります。2 つのプロセスが非常に接近しており、[プロセス 1] がキュー内の次のアイテムを読み取るとします。

何らかの理由で [プロセス 1] がまだ処理済みビットを設定する時間がない場合、[プロセス 1] が読み取ったばかりの同じアイテムを [プロセス 2] が読み取らないようにするにはどうすればよいですか?

注:アイテムをキューに追加する別のプロセス全体があります。そのプロセスがアイテムを追加するのを制限/ブロックしたくありません。

4

4 に答える 4

1

理解した:

BEGIN TRAN
    SELECT TOP * FROM TABLE WITH (XLOCK, ROWLOCK, READPAST)
    UPDATE TABLE SET Processed = 1
END TRAN

XLOCKROWLOCKは、現在読み取った行をロックします。READPASTは、現在ロックされている行を超えて読み取ります

そこで【処理1】は一番上の行を読み込んでロックします。[処理 2] は、次のロックされていない(未読の) 行を自動的に読み上げます。

于 2013-10-16T23:37:37.483 に答える
0

あなたはProcessedビットがあると言いました。新しい項目が読み取られるたびに比較して、処理済みビットが 1 に設定されていないことを確認できます。

Process1の動作に時間がかかる場合: 1. Process1の開始時にProcessedビットを 1 に設定し ます。または 2. 上記の Ash の説明に従って新しいビットを作成し、そのビットを 1 に設定します。

于 2013-10-16T23:04:42.347 に答える