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

解決


mao  2009-12-15 03:14:29  No: 36435

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

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-15 07:15:23  No: 36436

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

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


GTR  2009-12-17 20:07:14  No: 36437

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

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

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

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


mao  2009-12-18 07:10:50  No: 36438

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

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

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

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加