トランザクション処理をするには?

解決


HHH  2006-02-13 20:08:02  No: 20007

トランザクション処理の中でExecSQLを使用してINSERT処理を
行っていますが、commitする前にExecSQLの箇所でテーブル更新
されてしまいます。

以下がソースコードです。
-------------------------------
DataModule1.Database1.StartTransaction;
try
  with Query1 do begin
    Close;
    SQL.Clear;
    SQL.Add('###INSERT文###');
    EcecSQL;
    Close;
  end;
  DataModule1.Database1.Commit;
except
  DataModule1.Database1.Rollback;
end;
-------------------------------
トランザクション処理する際は、QueryもしくはDatabaseの
プロパティに何か設定が必要なのでしょうか?


篠田です  2006-02-13 23:12:45  No: 20008

StartTransaction;を行ってからだといいのでは?


篠田です  2006-02-13 23:14:19  No: 20009

すいません見落としていました。
もしかするとトランザクションをサポートしていないDBでは?
古いMySQLとか…


HOta  2006-02-13 23:27:29  No: 20010

Query1のDataBaseはDataBase1になっていますか?


HHH  2006-02-13 23:43:51  No: 20011

>篠田です  さん
Oracle9iを使用しています。

>HOta  さん
Query1のDataBaseNameは、DataBase1のDataBaseNameと同じものを
設定しています。
※念のため'DataBase1'に設定してみましたが、認識できないデータベース、
とエラーになってしまいました。


篠田です  2006-02-14 00:01:27  No: 20012

オートコミットを設定しているとか?
あと先のソースコードでコミットする前にロールバックしてないようですが?


HOta  2006-02-14 00:33:32  No: 20013

Query1のINSERT処理をトランザクション処理するのですから、
Query1のDataBaseはDataBase1を指定しないと、
トランザクションに含まれません。
DataBaseNameは別物です。
ちなみに、バージョンとか、接続はどうされていますか?


HOta  2006-02-14 00:48:36  No: 20014

済みません。ちょっと間違えました。
TDataBaseのAlias名でDataBaseに接続します。
プログラムの中で使用するDataBaseNameをDataBaseNameに指定します。
これで、Query1のDataBaseNameをDataBaseのDataBaseNameに合わせます。


HHH  2006-02-15 01:36:24  No: 20015

>篠田です さん
>HOta さん
いろいろありがとうございました。

あの後いろいろ検証した結果、正しくトランザクション処理ができるように
なりました。

結論からご報告しますと、プロジェクトファイル内でのCreateFormの
順番を変更したら解決しました。
---------------------------------------------------------
①ログイン画面、データモジュールの順番でCreateFormした場合
⇒トランザクション処理が行われない。
  (ExecSQLのタイミングでコミットされてしまう。)
②データモジュール、ログイン画面の順番でCreateFormした場合
⇒正常にトランザクション処理が行われる。
※実際にInsert処理を行っている画面は、自動生成の対象にしてないので、
  ログイン後にCreateFormされます。
---------------------------------------------------------
①の場合は、特にエラーになるわけでもなく、更新処理ができてしまって
いたので、なぜ、上記の対応でうまくいくようになったのかは、
正直まだ理解できていません。。

みなさまありがとうございました。


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

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






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