いつもお世話になっております。
Delphi7 SQLServer2000 環境で、ロック待ちの発生で困っています。
伝票明細の更新処理でTQueryのApplyUpdatesを使用していますが、
修正のときに、同一プログラム内でロック待ちが発生することがあります。
発生する箇所は、下記のQryBody.ApplyUpdates;の部分です。
エラーは発生しませんが、サーバー側からセッションを切らない限り
動かなくなります。
SQLServerで監視していますと、更新行数が多くなると、
ApplyUpdates実行時に同一プログラムからのセッション数が
複数に増えています。
この複数セッション間で同一キーの更新があるときに
ロック待ちが発生してハングアップします。
セッションが複数に分かれる理由がわからないのですが
プロパティなどで調整可能でしょうか?
SQL_SVR.StartTransaction;
QryBody.ApplyUpdates;
QryHead.ApplyUpdates;
SQL_SVR.Commit;
QryBody.CommitUpdates;
QryHead.CommitUpdates;
よろしくお願いします。
状況の追加訂正です。
更新行数の多少は、関係ありませんでした。
TQueryのUpdateObjectプロパティにTUpdateSQLをセットして
TUpdateSQLにはDelete、Update、InsertのSQL文を設定しています。
(処理)
1.行番号=1をDelete
2.行番号=2を行番号=1にUpdate
3.行番号=2 をInsert
処理3.のInsertが別のセッションになってしまうときがあります。
TQueryのApplyUpdateを使用せずに、
TUpdateSQLで削除、挿入を実行してはだめなんですか?
----------------------------------------------------
//削除
TUpdateSQL.Query[ukDelete].ExecSQL;
//更新
TUpdateSQL.Query[ukModefy].ExecSQL;
//追加
TUpdateSQL.Query[ukInsert].ExecSQL;
----------------------------------------------------
みたいに、してみてはどうですか?
GTRさん、ありがとうございます。
TUpdateSQLのExecSQLに変更してみましたが、結果は同じでした。
しかし、教えていただいたことをヒントにして、
同一伝票の明細を全件Delete後、TUpdateSQLのExecSQLで
現在の入力の各行をInsertするように書き換えましたところ、
発生しなくなったようです。
明細行の行削除時に次の行が繰り上がって
明細行番号がModify更新対象になりますが、
明細行番号はプライマリーキーの一部なので
Modifyで更新対象にするのがよくなかったのかもしれません。
大変、参考になりました。
ありがとうございました。
ツイート | ![]() |