あなたはキューを作成しようとしているようです。 SQL ServerのWihin、このようなシナリオのための2つの主要なソリューションがあります。
[1] Service Brokerが(参照:活性化、RECEIVE TOP(1)/TOP(100)
)を
または
[2]テーブルを使用してカスタムキューを開発するには、プラスUPDATE/DELETE/SELECT TOP(100) ... FROM dbo.QueueTable WITH(READPAST, ROWLOCK)
。これらのテーブルヒントの役割は以下の通りです:
READPAST
(ref - see READPAST section)(他の同時トランザクションによってロック)すでにロックされたレコード
ROWLOCK
(ref - see ROWLOCK section)は(行=レコードレベルでロックを強制的に読書を避けますページ/パーティション/テーブルロックとは対照的に)。さらに、キュー表のレコードを処理しようとしている(そして処理しようとしている)すべてのconcurentスレッドは、同じデータ・アクセス・パターン(READPAST, ROWLOCK
)を使用する必要があります。
あなたはここにレムスのブログ記事内の詳細を見つけることがあります。テーブルからの読み込みと処理レコードのhttp://rusanu.com/2010/03/26/using-tables-as-queues/
つのテンプレートを - キューは次のようになります。
SET XACT_ABORT ON
BEGIN TRY
-- BEGIN TRAN
CREATE TABLE #SelectedRecords TABLE (
...
)
DELETE TOP(100) FROM dbo.QueueTable WITH(READPAST, ROWLOCK)
OUTPUT deleted.Col1, deleted.Col2, ... INTO #SelectedRecords (Col1, Cold2, ...);
... Do something with those 100 records ...
-- COMMIT
END TRY
BEGIN CATCH
-- IF @@TRANCOUNT > 0
-- BEGIN
-- ROLLBACK
-- END
END CATCH
コメント行が国連であればSQL Serverは、キューテーブルからのデータの読み取り中およびデータ処理中に1つのTXを使用します。 1つの例外がキャッチブロックによって傍受された場合、SQL Serverは現在のTXをロールバックします(キューテーブルから読み込まれ、削除された100レコードを含む)。
注:理想的には、データ処理ブロックは、別の/ネストされたTXを開く/作成しないでください。
注意#2:あなたは確認する必要があり、インデックス(またはヒープ構造)がキュー表の支持体上で定義された(またはしない)場合はこのように行ロック:
SELECT i.allow_row_locks, *
FROM sys.indexes i
WHERE i.object_id = OBJECT_ID('dbo.QueueTable')
ノート#3:allow_row_locks
ビットはその後/ 0 falseの場合
ALTER INDEX index_name
ON dbo.QueueTable
REBUILD
WITH allow_row_locks = ON
LOCKED列が十分で、唯一の問題がクラッシュする可能性がある場合は、夜中に実行するマスターロック解除スケジュールされたタスクを追加するだけです。 – SunKnight0
http://blog.sqlauthority.com/2012/11/15/sql-server-concurrency-basics-guest-post-by-vinod-kumar/ –
http://stackoverflow.com/questions/1138026/sql-サーバー・パフォーマンスと、多くの並行-長時間実行-クエリ私はまだ、これは私が探しているものです全くわからないものの、詳細な応答をありがとう –