トランザクションモード

オンラインとバッチタスク

オンラインとバッチタスクでは、トランザクション処理に対応した4つのモード設定があります。

D=遅延

データ操作(DML)ステートメントが一時的にキャッシュに保存され、すぐには物理データベースに送信されません。他のユーザはそのデータにアクセスすることはできません。このトランザクションが終了した時点で、トランザクション間に記録された様々な処理コマンドによってデータベースが更新されます。データベースの更新は、[更新レコードの識別]特性の設定内容に従って実行されます。キャッシュに蓄積されたすべてのDMLステートメントはすぐに実行され、トランザクションはクローズされます。修正内容がコミットされる前に、選択されたデータが修正された場合、エラーメッセージが表示され、更新内容が失われます。この場合、更新処理をやり直すしか方法はありません。更新されたデータが遅延トランザクション内にある場合、失われる可能性があることに注意してください。

DMLステートメントが失敗した場合、Magic xpaはトランザクション全体をまとめて再送します。

遅延トランザクションでは、親タスクと子タスクで同じトランザクションを共有します。子タスクのレベルでロールバックした場合、子タスク内での更新はロールバックされ、親タスクの変更は更新されます。子タスクの変更を親タスクと独立させたい場合、ネスト遅延トランザクションを使用してください。

例外:遅延トランザクションは、ローカルデータソースではにサポートされません。

参考:SpecialNoCheckIndexInDeferred

N=ネスト遅延

遅延トランザクションが追加作成されます。タスクが終了すると、ネスト遅延トランザクションは親の遅延トランザクションに従ってコミットされます。親/子タスクにおいて、子タスクで行われる変更は、親タスクから独立しています。

Magic xpaは、ネストトランザクションを実装するためにデータベースに直接指示を出すことはありません。ネスト機能はMagic xpa自体によって行われます。

W=親と同じ

タスクは、動作中のトランザクション内で実行されます。

  • 物理トランザクションが開いている場合は、現在のタスクは物理トランザクションの一部となります。

  • 遅延トランザクションが開いている場合は、現在のタスクはその遅延トランザクションの一部となります。

  • 親タスクがトランザクションを開始していない場合、現在のタスクはトランザクションを使用しません。

P=物理

物理トランザクションでは以下のように動作します。

  1. データベースでトランザクションを開きます。
    Magic xpaは、一度に1つのトランザクションだけが有効になります。ネストトランザクションの選択はできません。

  2. [レコード後]の後で各DMコマンドをデータベースに送信します。これに対する例外は、DML(Data Manipulation Language)ステートメントを明示的にロックするためにあります。そして、それは[ロック方式]特性にもとづいて送信されます。
    Magic xpaは遅延トランザクションのようにキャッシュにコマンドを保存せず、それがデータベースに発生したように各コマンドを送信します。

  3. COMMITまたはROLLBACKコマンドをデータベースに送信します。

ほとんどのデータベースのDDLコマンド(例えば、CREATEやDROP、ALTER)は、自動的にトランザクションを開始し終了します。DDLコマンドを発行すると直ぐに、データベースによって自動COMIMTが発行されます。トランザクションの最中にDDLを使用することは避けてください。たとえば、テーブルはトランザクション中に作成したりドロップしないようにしてください。

注意:

  • 定義された分離レベルに従って、更新されたデータをコミットされる前に他のユーザが参照することができます。

  • ODBCでは、物理ロックはありません。ISAMデータベースを使用する場合は、動作環境の「ISAM トランザクション」を参照してください。

 

注意:

  • トランザクションを開始することなく多くのレコードを作成したり更新した場合、自動コミットモードが動作します。この場合、パフォーマンスが低下します。

  • タスクで物理トランザクションが定義されていても、タスクにデータソースが定義されていない場合は、データベースの物理トランザクションは開きません。これは、[トランザクション]モードが「親と同じ」に定義されたサブタスクでは、トランザクションの一部ではないため、ゆっくり動作するかもしれないことを意味します。このようなシナリオでは、少なくとも1つのデータソースを定義してトランザクションに含めるように則すメッセージが表示されます。

リッチクライアントタスク

リッチクライアントタスクでは、以下のモードが選択できます。

W=有効な遅延トランザクション内

デフォルト。このモードは、上記の遅延トランザクションモードと同じような動作になります。このモードで定義されたタスクを実行すると、([トランザクション開始]特性に基づいて)以下のようにトランザクションが開始されます。

  • トランザクションが開始されている場合は、タスクはそのトランザクションの一部になります。

  • トランザクションが開始されていない場合、新規の遅延トランザクションを開始します。

親タスクのトランザクションがロールバックされると、子タスクのトランザクションもロールバックされます。

1つの親タスクに対して、子タスク内で多くのトランザクションを開くことができるため、注意して使用しなければなりません。一度に複数のタスクレベルのロールバックするには、正当な理由がない限り、「新規の遅延トランザクション」を指定した方がより安全です。

N=新規の遅延トランザクション

このモードは、上記のネスト遅延トランザクションモードと同じような動作になります。このモードで定義されたタスクを実行すると、([トランザクション開始]特性に基づいて)以下のようにトランザクションが開始されます。

  • 新しい遅延トランザクションが開始されます。

  • (コールトランザクションにかかわらず、)トランザクションが終了した後に、このトランザクションによるどのような更新内容もコミットされます。

  • トランザクションがまだオープン中の場合、コールトランザクションを終了させることができます。コールトランザクションを終了させても、このトランザクションには影響しません。

  • 新規のトランザクションは、独自のトランザクションキャッシュを持っています。トランザクションキャッシュはトランザクション間で共有することができず、一方のトランザクション内での更新内容は他のトランザクションで参照することはできません。

O=なし

Magic xpaは、タスクのためにトランザクションを開始しません。データの保存を行わないタスク上でのみ使用しなければなりません。これによって、子タスク内でトランザクションをバンドルする、トランザクション・ラッパを開くようなことを防止します。バックグラウンドで使用するメイン画面やフレームを作成する場合は、これを使用してください。

 

注意:

  • サブフォームやフレーム上で実行しているタスクは、上記のリッチクライアントタスクでのトランザクションモードのどれかを設定することができます。

  • [出力先]特性を設定した[コール]処理コマンドを使用した場合、サブフォームやフレーム内で実行しているタスクは終了します。

    • タスク内のトランザクションが遅延している場合、トランザクションが(開始したタスクで)終了するまで、データはコミットされません。

    • タスクが新規に開始したトランザクションが遅延の場合、そのトランザクションは終了し、データはコミットされます。

オフラインタスク

ローカルデータソースでは、物理トランザクションとして動作します。ローカルデータソースを含むすべてのタスクは、同じトランザクション内で動作します。

ローカルデータのコミットは、トランザクションを開いたタスクで行ってください。トランザクションが兄弟タスクでも開始されている場合、これらのタスクのデータもコミットされます。

ローカルデータソースを持つタスクをロールバックした場合、以下をロールバックします。