2017-01-06 61 views
1

私は読者の中をループし、読者が読んでいる別のテーブルを更新しています。すべての1000のループは、私が)(トランザクションの独立をコミットしたいが、それは誤り与えている:私は2件の他の回答を見てきたし、そのうちの一つは、読者に近いと述べたが、我々は明らかに我々が「としてそれを行うことはできませんdatareaderループ内でトランザクションをコミットする

The transaction operation cannot be performed because there are pending requests working on this transaction.

をリーダーからのそのデータを使用して更新ステートメントを実行し、別のテーブルを更新します。

それで、接続でトランザクションを作成すると、sqlコマンドをループしているデータレアがあります。どのようにしてdatareaderループ内でupdateコマンドを実行し、トランザクションをcommit()することができますか? datareaderループ?

1)2番目の接続を開き、トランザクション更新のためにそれを使用します。

+0

あなたのコードを投稿することができますか?トランザクションで異なるトランザクション分離レベル設定が必要な同時実行性の問題が発生する可能性があります。 –

+0

これは、既にアプリにあった既存のdatareaderループにこれを挿入しているので、面倒で深みのあるコードです。それを打破するのは難しいです。このようなことをすることが一般的であるか、それが可能でない場合、私はちょうど興味がありました。 – user441521

+0

トランザクション書き込み操作に2つ目の独立した接続を使用することができます(なぜなら、トランザクションを1000行ごとにコミットするのは、一括更新だけではなく、それをコミットするかどうかです)、またはデータ・レイアウト・コンストラクタ・オプション私は正確に覚えていない "更新可能な"モードを使用していましたが、これはトランザクション内で異なった振る舞いをしていて、調べる価値があるかもしれません。 – dlatikay

答えて

1

あなたはこれを達成するための2つのオプションがあります。

2)、SQL Serverの "複数のアクティブな結果セット" オプションを使用します。

If two batches are submitted under a MARS connection, one of them containing a SELECT statement, the other containing a DML statement, the DML can begin execution within execution of the SELECT statement.

出典:https://msdn.microsoft.com/en-us/library/h32h3abf(v=vs.110).aspx

+0

2番目の接続がないと推測するために、一時表(SQLサーバー内の#)で更新が行われていますそれ?たぶんグローバル(##)テンポラリテーブルではなく、それを見るのですか? – user441521

+0

真、1つのセッションは別のセッションの一時テーブルを見ることができません。なぜあなたはその取引をもう一度必要としますか?更新されたテーブルがあなたの接続に対してプライベートで、マルチスレッドではない場合、トランザクションがどのような価値を追加するかはわかりません。 – dlatikay

+1

速度。これがなければ、私たちが実行している更新ステートメントごとに暗黙的なトランザクションを作成しています。リーダーはすべてのレコードをループしているので、何十万もの処理が行われています。既存のプロセスは効率的ではありませんが、それは今取り組むべき課題ではありません。それは、それを元気にすることです。 – user441521

関連する問題