データベースのトランザクションについて

MZ Platformとは 掲示板 MZプラットフォームユーザー会掲示板 データベースのトランザクションについて

6 件の投稿を閲覧中 - 1 ~ 6 件(全 6 件)
  • 著者
    投稿
  • #5473
    ORIteck CO., LTD
    一般参加者

    データベースはMYSQLを使用しています。トランザクションはデフォルト状態で自動コミットのままです。

    データベース側で複数の処理をした後、全てをコミットしたく現在は、MZ内で下記のよう記述でした。
    BEGINで接続 実行 切断
    処理1で接続 実行 切断
    処理2で接続 実行 切断
    複数このような事をして、
    COMMITで接続 実行 切断
    これでは毎回、接続 切断なので思った通りならない事に気づきました。

    そこでこの様な処理は、BEGINからCOMMITまでを接続状態で実行すれば良いのだろうと思い、そのような複合コンポーネントを使用することで、途中で何らかのエラーが発生しても、そこまでの結果はデータベースに反映されないことは確認できました。

    ここから質問ですが、
    1、上記のことは当たり前かもしれませんが、この認識で間違えないでしょうか。

    2、どこかでデータベースの接続を切断する必要がありますが、エラー発生時のダイアログを閉じるタイミングで切断することは可能でしょうか?

    3、切断する方法は、ファンクションとデータベースアクセス(データベースとの接続を切断する)を繋ぎ、ファンクションを呼び出すでいいですか?

    4、常時接続と都度接続切断のメリットデメリットについてご意見いただけないでしょうか。

    以上 よろしくお願いします。

    #5477
    MZPlatformユーザー会
    サイト管理者

    下記回答です。

    1.実際に確認していないので正確にはわかりませんが、接続したまま複数のクエリを実行して、最後に切断する方法は間違いないと思います。ただ、自動コミットのままで本当にそうなったでしょうか。単に最初のクエリでエラーが出たからということはないですか。そもそも、このように分ける必然性がよくわかりません。毎回コミットせずに、例えば複数のテーブルに対するクエリを一括で反映したいということでしょうか。
    なお、FAQにはトランザクションの話題が複数ありますので、下記リンク先をご覧ください。
    https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a51.html
    https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a40.html
    https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a73.html
    https://ssl.monozukuri.org/mzplatform/faq/faq/faq_technical/database/database_a27.html

    2.そういう切断方法も可能です。ダイアログのアクションイベント処理から呼び出します。また、エラーが発生しても必ず実行させるようにメソッド起動のFinally起動というものもあります。

    3.はい、それでよいです。ファンクションを使わずに直接呼んでも同じです。

    4.詳細には調べていませんが、これは特に違いはないと思います。必ず切断してから終了することが重要です。一点だけ、接続している時間が長いと、複数からの接続で同時接続数の問題が出るかもしれません。

    #5481
    ORIteck CO., LTD
    一般参加者

    FAQを参考に検討してみます。

    2点確認させてください。
    Q1、サンプルファイルの、トランザクション処理.mzax内のテーブル KEY:SQLコマンドですが、1列目の値:0はどの様な意味でしょうか?

    Q2、SQL文末尾のセミコロン;ですが、MZでは記述があってもなくても実行するようですが、このような仕様ですか?

    よろしくお願いします。

    #5482
    MZPlatformユーザー会
    サイト管理者

    下記回答です。

    1.テーブルにSQL文を記述して実行する際には、0列目にSQL文、1列目に実行時に発生するイベント番号を記入したテーブルを渡します。イベント発生時に処理を分岐したい場合には、別の番号を指定する必要がありますが、分岐が不要であれば常に0と記入しておけば良いです。

    2.MySQLコマンドラインクライアントでSQL文を実行する場合はセミコロンが必要ですが、MZでデータベースアクセスコンポーネント経由でSQL文を実行する場合はセミコロン不要です。これは仕様になります。

    #5502
    ORIteck CO., LTD
    一般参加者

    サンプルのトランザクション処理.mzaxを参考に進めています。テーブルは使用していませんが上手く行かず試行錯誤していました。結果的には、トランザクション処理の中にDDL文を含むクエリがあることが問題のようで、一連の処理の中で分割することで対応しようと考えています。そこで、erroronlyの動作タイミング?についてお願いします。

    例えば、1から10までのクエリを送る一連の処理があり、1から7までが通常処理で8から10までがerroronly処理であるとします。(6,7には次のルーチンがあり、これを実行されると困ります)

    Q1 5の処理でerror発生時、6、7の処理は実行せずに8から10の処理を実行し終了するで良いですか?

    Q2 データベースアクセスでエラーが発生すると発生の都度ダイアログが表示されていたのですが、サンプルのトランザクション処理.mzaxでも途中でエラーがあるとダイアログは表示されますか? データベースへの『毎回、接続ー処理ー切断』と『常時接続』で違いがありますか?

    よろしくお願いします。

    #5505
    MZPlatformユーザー会
    サイト管理者

    1.実際の状況によりますが、基本的にはエラー発生後の通常メソッド起動は飛ばされて、ErrorOnlyやFinallyの起動メソッドだけが実行されます。そのようなサンプルアプリを作成して試してみるのが良いと思います。

    2.データベースアクセスに限らず、起動メソッドでエラーが発生すると、通常はその都度ダイアログが表示されます。ただし、ErrorOnlyやFinallyの起動メソッドがあると、エラーダイアログが表示されなくなるという仕様になっていると思います。そのため、サンプルではErrorOnlyでダイアログを表示する処理を追加している箇所があります。

6 件の投稿を閲覧中 - 1 ~ 6 件(全 6 件)
  • このトピックに返信するには、ログインしてください。