TIBSQLでまとめてCommitするとフリーズする?


ティモテ  2014-03-15 00:51:23  No: 46122

Firebird1.5、Delphi6、OS(Win7 64bit,XP)
TIBSQLを使用してテーブルにUPDATE文を流しています。
テーブルが11個あり、各テーブルにあるKUBUNフィールドを更新しています。
テーブル1と11だけレコード数が多いです。

for文で11個のテーブルに
  ibsqlClear.SQL.Text := 'UPDATE ' + cmbTable.Items[i] + ' SET KUBUN=''0'' WHERE KUBUN<>''9'' and KUBUN<>''1''';
  ibsqlClear.ExecQuery;
を流して最後にCommitするという記述になっているのですが、
11個目のテーブルに対してExecQueryを実行した時にフリーズしてしまします。
しかし、これを10個目のテーブルまでExecQueryを実行してCommitを行い、再度StartTransactionをしてから11個目のテーブルにExecQueryを行いCommitすると通ります。
また、PCによっては11個まとめてCommitする方でも通ります。
何かの設定でサイズ制限がありそうな感じなのですがこれは何が原因なのでしょうか。

以下に関係している部分のソースを記述しておきます。
・11個目テーブルのExecQueryでフリーズするソース
  if not ibtrnDefault.InTransaction then
    ibtrnDefault.StartTransaction;

  for i := 0 to 10 do
  begin
    cmbTable.ItemIndex := i;
    cmbTableChange(nil);

    if (cmbFilterKey.Items.Count > 0) and (cmbFilterKey.Items[0] = 'KUBUN') then
    begin
      ibsqlClear.SQL.Text := 'UPDATE ' + cmbTable.Items[i] + ' SET KUBUN=''0'' WHERE KUBUN<>''9'' and KUBUN<>''1''';
      ibsqlClear.ExecQuery;
    end;
 end;

 ibtrnDefault.Commit;

・10個のテーブルと1個のテーブルに分けてCommitするソース
  if not ibtrnDefault.InTransaction then
    ibtrnDefault.StartTransaction;

  for i := 0 to 9 do
  begin
    cmbTable.ItemIndex := i;
    cmbTableChange(nil);

    if (cmbFilterKey.Items.Count > 0) and (cmbFilterKey.Items[0] = 'KUBUN') then
    begin
      ibsqlClear.SQL.Text := 'UPDATE ' + cmbTable.Items[i] + ' SET KUBUN=''0'' WHERE KUBUN<>''9'' and KUBUN<>''1''';
      ibsqlClear.ExecQuery;
    end;
 end;

 ibtrnDefault.Commit;

 if not ibtrnDefault.InTransaction then
   ibtrnDefault.StartTransaction;
 ibsqlClear.SQL.Text := 'UPDATE ' + cmbTable.Items[10] + ' SET KUBUN=''0'' WHERE KUBUN<>''9'' and KUBUN<>''1''';
 ibsqlClear.ExecQuery;
 ibtrnDefault.Commit;


igy  2014-03-15 06:16:51  No: 46123

ちなみにフリーズが発生するPCで、その操作を別のアプリ、たとえば、
コマンドライン isql 等 で実行した場合、正しく動作しますか?

あと、関係ないかもしれませんが、

・Firebird は Ver.1.5.6ですか?
・Delphi 6 は Update2 + RTL アップデート が適用済みですか?
・Delphi 6 の IBX のバージョンは6.11ですか?

それと、

特定のPCでlocalhostのGDBへのアクセスが遅い原因は?
https://www.petitmonte.com/bbs/answers?question_id=8280

では、

>原因はInterbaseが起動していたため

とありますが、GDS32.DLL が Firebirdのものではなく、InterBaseのものだったり、はないですか?


igy  2014-03-15 20:00:47  No: 46124

あと、

特定のPCでlocalhostのGDBへのアクセスが遅い原因は?
https://www.petitmonte.com/bbs/answers?question_id=8280

で、DEKOさんが書かれていますが、まだ、拡張子がGDBのままであれば、FDB 等に変更してみるのも
よいかもしれません。


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

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






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