質問

.Net 2.0、ADO.NET、データセットおよびデータアダプターを使用してデータを管理し、Microsoft SQL Server 2005をデータベースマネージャーとして使用しています。

非常に多くの結果(500K +)を生成し、データベースに保存するアプリケーションがあります。 1つの結果生成が失敗した場合、結果を保存しないようにします。そのため、結果を生成できない場合にロールバックされるトランザクション内にすべてのデータベース挿入を配置します。

ただし、すべての結果が書き込まれるまでテーブルはロックダウンされますが、これは意図したものではありません。または、少なくともロックダウンされていると思われ、挿入が終了するまでSELECTクエリは応答しません。

トランザクションがアクティブな間にテーブルをロックしないようにトランザクションを作成する方法はありますか?

非常に多くの挿入が行われるトランザクションを使用することをお勧めしますか?

役に立ちましたか?

解決

一時的なステージングテーブルを使用できます。自分のペースで記入してください。次に、1つのSELECT INTOで単一のトランザクションとして最終移動を実行します。大きな移動が完了したら、ステージングテーブルを削除します。

全体的な整合性についてより強い制限がある場合は、軽量テーブル、データフローのステージを反映したテーブル、ジャーナル/ログテーブルを追加することができます。一部の回復/補償/クリーンアップルーチンなど

他のヒント

トランザクションをより小さなバッチに分割し、1kごとにコミットすることを検討することをお勧めします。

selectステートメントで WITH(NOLOCK)ヒントを指定することでロックを抜けることができます(テーブル名の直後に置きます)。ただし、コミットされました(ロールバックされる可能性のあるもの)。挿入で使用できる WITH(ROWLOCK)ヒントもあります。これにより、選択をロックする可能性を減らすことができます(挿入された行にアクセスしようとすると、ロックが発生します)コミットされていないトランザクションによって実行されますが、SQLはテーブル全体のロックを解除しないため、発生する可能性は低くなります。

テーブルヒントの詳細については、こちらをご覧ください。パフォーマンスに影響を与える可能性があるため、それらには十分注意してください。役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top