1

彼らがラジオで言うように-長年のリスナーの初めての発信者....

これが私の問題です。VS 2005 SQLServer2005データベース。Windowsフォームアプリ。C#。大きなテーブル-780Kレコード。これをソーステーブルと呼びます。ソーステーブルをループする必要があり、レコードごとに別のテーブルで何かを実行してから、完了したことをソーステーブルに書き戻します。私はまだ2番目のテーブルを更新するまでには至っていません...

接続オブジェクトAを使用するデータリーダーを使用してソーステーブルのすべてのレコードをループします。レコードごとに、このレコードが処理されたことを示すためにソーステーブルを更新する更新ステートメントを作成し、接続オブジェクトBに対してSQLコマンドを使用してこれを行います。 uodate。dataReaderが排他的であることを知っているので、異なる接続オブジェクト。

これが問題です。Xレコードを処理した後(Xは約60のようです)、更新がタイムアウトします。

これを書いている間-これがどのように起こるかおかしいです-私の脳はこれがトランザクションの分離および/またはロックに関係していると私に言います...つまり私はデータリーダーを使用してソースレコードを読んでいますが、それらのレコードを変更しています...これがさまざまなトランザクション分離で問題を引き起こしていることがわかるので、それを調べます...

誰もがこれを見て、それを解決する方法を知っていますか?

乾杯

ピート

4

3 に答える 3

2

詳細がなければ、ソリューションの可能性は非常に多くなります。iivelが指摘したように、データベース自体の中ですべてのアクティビティを実行できます。実行する必要のある操作のタイプでそれが可能であれば。カーソルではなく、セットベースの操作を使用してそのようなことを行うのが非常に可能性が高いことを付け加えておきます。

データベースの外部でこの操作を実行する必要がある場合は、ロックをまったく使用せずにソースクエリを実行できます。これが安全な場合です。これを行うには、分離レベルを設定するかwith (nolock)、クエリでテーブル名/エイリアスの後に追加するだけです。

他にもいくつかのオプションがあります。たとえば、代わりに、ソーステーブルからメモリに一度に1000レコードをプルし、切断してから、必要な操作と更新を実行するなど、バッチで操作することができます。1000レコードすべてが処理されたら、キュー内のすべてのレコードが処理されるまで、1000レコードの別のセットで作業します。

于 2010-12-15T02:16:11.963 に答える
0

コマンドオブジェクトでコマンドタイムアウトを適切に設定する必要があるようです。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout(v=vs.80).aspx

于 2010-12-15T01:44:26.007 に答える
0

カーソルで選択/更新を行い、最終結果の集計をアプリに返すことができない理由はありますか? プロセスが DB に属している場合は、そこに保持することをお勧めします。

ジョンが言及したようにコマンドのタイムアウトを交互に更新することは、あなたの唯一の他の賭けです。

于 2010-12-15T01:51:35.123 に答える