トランザクション処理の中で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の
プロパティに何か設定が必要なのでしょうか?
StartTransaction;を行ってからだといいのでは?
すいません見落としていました。
もしかするとトランザクションをサポートしていないDBでは?
古いMySQLとか…
Query1のDataBaseはDataBase1になっていますか?
>篠田です さん
Oracle9iを使用しています。
>HOta さん
Query1のDataBaseNameは、DataBase1のDataBaseNameと同じものを
設定しています。
※念のため'DataBase1'に設定してみましたが、認識できないデータベース、
とエラーになってしまいました。
オートコミットを設定しているとか?
あと先のソースコードでコミットする前にロールバックしてないようですが?
Query1のINSERT処理をトランザクション処理するのですから、
Query1のDataBaseはDataBase1を指定しないと、
トランザクションに含まれません。
DataBaseNameは別物です。
ちなみに、バージョンとか、接続はどうされていますか?
済みません。ちょっと間違えました。
TDataBaseのAlias名でDataBaseに接続します。
プログラムの中で使用するDataBaseNameをDataBaseNameに指定します。
これで、Query1のDataBaseNameをDataBaseのDataBaseNameに合わせます。
>篠田です さん
>HOta さん
いろいろありがとうございました。
あの後いろいろ検証した結果、正しくトランザクション処理ができるように
なりました。
結論からご報告しますと、プロジェクトファイル内でのCreateFormの
順番を変更したら解決しました。
---------------------------------------------------------
①ログイン画面、データモジュールの順番でCreateFormした場合
⇒トランザクション処理が行われない。
(ExecSQLのタイミングでコミットされてしまう。)
②データモジュール、ログイン画面の順番でCreateFormした場合
⇒正常にトランザクション処理が行われる。
※実際にInsert処理を行っている画面は、自動生成の対象にしてないので、
ログイン後にCreateFormされます。
---------------------------------------------------------
①の場合は、特にエラーになるわけでもなく、更新処理ができてしまって
いたので、なぜ、上記の対応でうまくいくようになったのかは、
正直まだ理解できていません。。
みなさまありがとうございました。
ツイート | ![]() |