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

解決


HHH  2006-02-13 20: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 23:12:45  No: 20008  IP: [192.*.*.*]

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

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

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

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

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

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

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

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

編集    削除
篠田です  2006-02-14 00:01:27  No: 20012  IP: [192.*.*.*]

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

編集    削除
HOta  2006-02-14 00:33:32  No: 20013  IP: [192.*.*.*]

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

編集    削除
HOta  2006-02-14 00:48:36  No: 20014  IP: [192.*.*.*]

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

編集    削除
HHH  2006-02-15 01:36:24  No: 20015  IP: [192.*.*.*]

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

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

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

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

編集    削除