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

解決


HHH  2006-02-13 11:08:02  No: 20007  IP: 192.*.*.*

トランザクション処理の中で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 14:12:45  No: 20008  IP: 192.*.*.*

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

編集 削除
篠田です  2006-02-13 14:14:19  No: 20009  IP: 192.*.*.*

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

編集 削除
HOta  2006-02-13 14:27:29  No: 20010  IP: 192.*.*.*

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

編集 削除
HHH  2006-02-13 14:43:51  No: 20011  IP: 192.*.*.*

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

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

編集 削除
篠田です  2006-02-13 15:01:27  No: 20012  IP: 192.*.*.*

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

編集 削除
HOta  2006-02-13 15:33:32  No: 20013  IP: 192.*.*.*

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

編集 削除
HOta  2006-02-13 15:48:36  No: 20014  IP: 192.*.*.*

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

編集 削除
HHH  2006-02-14 16:36:24  No: 20015  IP: 192.*.*.*

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

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

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

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

編集 削除