applyupdates 複数セッションに分かれる

解決


mao  2009-12-14 18:14:29  No: 36435  IP: 192.*.*.*

いつもお世話になっております。

Delphi7 SQLServer2000 環境で、ロック待ちの発生で困っています。

伝票明細の更新処理でTQueryのApplyUpdatesを使用していますが、
修正のときに、同一プログラム内でロック待ちが発生することがあります。
発生する箇所は、下記のQryBody.ApplyUpdates;の部分です。
エラーは発生しませんが、サーバー側からセッションを切らない限り
動かなくなります。
SQLServerで監視していますと、更新行数が多くなると、
ApplyUpdates実行時に同一プログラムからのセッション数が
複数に増えています。
この複数セッション間で同一キーの更新があるときに
ロック待ちが発生してハングアップします。
セッションが複数に分かれる理由がわからないのですが
プロパティなどで調整可能でしょうか?

 SQL_SVR.StartTransaction;
 QryBody.ApplyUpdates;
 QryHead.ApplyUpdates;
 SQL_SVR.Commit;
 QryBody.CommitUpdates;
 QryHead.CommitUpdates;

よろしくお願いします。

編集 削除
mao  2009-12-14 22:15:23  No: 36436  IP: 192.*.*.*

状況の追加訂正です。
更新行数の多少は、関係ありませんでした。

TQueryのUpdateObjectプロパティにTUpdateSQLをセットして
TUpdateSQLにはDelete、Update、InsertのSQL文を設定しています。
(処理)
1.行番号=1をDelete
2.行番号=2を行番号=1にUpdate
3.行番号=2 をInsert 
処理3.のInsertが別のセッションになってしまうときがあります。

編集 削除
GTR  2009-12-17 11:07:14  No: 36437  IP: 192.*.*.*

TQueryのApplyUpdateを使用せずに、
TUpdateSQLで削除、挿入を実行してはだめなんですか?

----------------------------------------------------
//削除
TUpdateSQL.Query[ukDelete].ExecSQL;

//更新
TUpdateSQL.Query[ukModefy].ExecSQL;

//追加
TUpdateSQL.Query[ukInsert].ExecSQL;
----------------------------------------------------
みたいに、してみてはどうですか?

編集 削除
mao  2009-12-17 22:10:50  No: 36438  IP: 192.*.*.*

GTRさん、ありがとうございます。

TUpdateSQLのExecSQLに変更してみましたが、結果は同じでした。
しかし、教えていただいたことをヒントにして、
同一伝票の明細を全件Delete後、TUpdateSQLのExecSQLで
現在の入力の各行をInsertするように書き換えましたところ、
発生しなくなったようです。

明細行の行削除時に次の行が繰り上がって
明細行番号がModify更新対象になりますが、
明細行番号はプライマリーキーの一部なので
Modifyで更新対象にするのがよくなかったのかもしれません。

大変、参考になりました。
ありがとうございました。

編集 削除