0

テーブルがあり、そこから常にすべてのデータが必要です(これは別のプログラムによって入力されているバッファーです)。また、このデータを読み取ったら、テーブルから削除したいと思います。だから私は次のようなものを持っています

BEGIN TRANS T1;
DELETE FROM table_name OUTPUT DELETED.*;
COMMIT TRANS T1;

リーダープログラムでは、DataReaderを使用して各行をループしています。私が心配しているのは、このデータの読み取り中に問題が発生した場合はどうなるかということです。たとえば、スレッドがクラッシュし、データの一部しか読み取っていません。これがトランザクションの場合、どの時点でコミットされますか?読み始めたら?別のプログラムが常にテーブルに書き込もうとしているので、しばらくの間このテーブルをロックすることは避けたいと思います。

これを行うためのより良い方法はおそらくありますか?このテーブルに次々とレコードを書き込んでいるプログラムがあり、このプログラムを使用して取得したいと思います。よりコストのかかる一連の「deletewhere」句の代わりに、DELETE-OUTPUT DELETEDを使用できるように、一度にすべてを取得しています。私は、ライターとリーダーの両方が途切れることなく進み続けることができる方法を望んでいます。

4

2 に答える 2

3

この方法で確認する方法はありません。

私はこのようなものを提案します。

  1. 削除するレコードをステージングテーブルに移動します。

  2. ステージングテーブルの内容をアプリケーションに出力します

  3. コンテンツが処理されたことをアプリケーションから確認します。

  4. ステージングテーブルからコンテンツを削除します。

于 2013-01-15T20:21:51.040 に答える
0

DataReaderをクラッシュさせて、を参照してください。

SQLではなくMSMQを使用できますか?

オプションA-ホーガン-良い答え

オプションBPK
はありますか?
削除は本当にコストがかかりすぎるのですか?
トランザクションの必要性を取り除きます。

オプションCX
のブロック(上部)(1000など)を別のテーブルではなく.NETコレクションに読み込みます。(....)のIDを削除します

于 2013-01-15T22:46:56.660 に答える