1

関連するいくつかのテーブルにデータを挿入する挿入トランザクションを長時間実行しています。

この挿入の実行中は、メインテーブルから選択 * を実行できません。選択は、挿入が完了するまでホイールを回転させるだけです。

これらの挿入のいくつかを同時に/重複して実行します。情報が 2 回挿入されていないことを確認するために、最初に MainTable にクエリを実行して、エントリが存在するかどうか、およびその処理済みビットが設定されていないかどうかを確認します。

挿入トランザクション中に、その行の MainTable 処理済みビットを反転します。

そのため、テーブルを読み取って、特定の行が現在更新されているかどうかを確認できる必要があります。

Microsoft SQL 2005 でこれを設定する方法についてのアイデアはありますか? SET TRANSACTION ISOLATION LEVELのドキュメントを調べています。

ありがとう、
キース

編集: 同じ挿入バッチが同時に発生するとは思わない。これらは、処理中のバイナリ ファイルであり、そのデータがデータベースに挿入されます。データを解析して挿入する前に、ファイルが処理されていないことを確認します。チェックを行うとき、ファイルが表示されていない場合は、処理されたビットを false に設定して MainTable にすばやく挿入します。

テーブル全体ではなく、更新中の行をロックする方法はありますか?

4

2 に答える 2

2

READ UNCOMMITTED を使用する前に、プロセスを再考することをお勧めします。孤立したトランザクションには多くの正当な理由があります。READ UNCOMMITTED を使用すると、両方の挿入が同時に更新をチェックし、両方が重複を作成していない可能性があるため、重複が発生する可能性があります。小さなバッチに分割するか、定期的な COMMITS を発行してみてください

編集

そのテーブルをより迅速に解放するトランザクションで MainTable の更新をラップできますが、それでも他のテーブルと競合する可能性があります。

すなわち

BEGIN TRANSACTION

SELECT @ProcessedBit = ProcessedBit FROM MainTable WHERE ID = XXX

IF  @ProcessedBit = False
    UPDATE MainTable SET ProcessedBit = True WHERE ID = XXX

COMMIT TRANSACTION

IF  @ProcessedBit = False
BEGIN
    BEGIN TRANSACTION
    -- start long running process
    ...
    COMMIT TRANSACTION
END

編集してエラー回復を有効にする

BEGIN TRANSACTION

SELECT @ProcessedStatus = ProcessedStatus FROM MainTable WHERE ID = XXX

IF  @ProcessedStatus = 'Not Processed'
    UPDATE MainTable SET ProcessedBit = 'Processing' WHERE ID = XXX

COMMIT TRANSACTION

IF  @ProcessedStatus = 'Not Processed'
BEGIN
    BEGIN TRANSACTION
    -- start long running process
    ...

   IF No Errors
   BEGIN
       UPDATE MainTable SET ProcessedStatus = 'Processed' WHERE ID = XXX
       COMMIT TRANSACTION
   ELSE
       ROLLBACK TRANSACTION

END
于 2008-10-30T22:42:27.233 に答える
0

あるトランザクションが進行中の別のトランザクションによって実行された変更を (コミット前に) 読み取ることができる唯一の分離レベルは次のとおりです。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
于 2008-10-30T22:35:22.333 に答える