トランザクション
トランザクションとは
HULFT Squareのトランザクション管理はJ2EEの標準的な枠組みである「JTA(Java Transaction API)」に準拠しています。
HULFT Squareでは、トランザクションは以下の処理ごとに設定できます。
-
スクリプト
-
指定した処理
スクリプトのトランザクション
トランザクションをスクリプトごとに設定する場合、以下の6種類のトランザクション属性を選択できます。
-
NEVER
-
NOTSUPPORTED
-
SUPPORTS
-
REQUIRED
-
REQUIRESNEW
-
MANDATORY
トランザクション属性は以下の観点で設定します。
-
呼び出し元のトランザクションの制限
対象のスクリプトに対して以下のどの制限が必要かを設定します。
- 制限1:
-
トランザクションをサポートしたスクリプトが呼び出される必要がある(トランザクションに含めなければならない)
NEVER
- 制限2:
-
トランザクションをサポートしないスクリプトから呼び出される必要がある(トランザクションに含めてはならない)
NOTSUPPORTED, SUPPORTS, REQUIRED, REQUIRESNEW
- 制限3:
-
どのようなトランザクションをサポートしているスクリプトからも呼び出すことができる
MANDATORY
-
呼び出し元トランザクションの引き継ぎ
対象のスクリプトが、呼び出し元のトランザクションを引き継いで、同一のトランザクションとして動作するかどうかを設定します。
トランザクション属性は以下のとおりです。
トランザクション属性 |
設定の観点 |
説明 |
|
---|---|---|---|
1.呼び出し元トランザクションの制限 |
2.呼び出し元トランザクションの引き継ぎ |
||
NEVER (制限1) |
以下のトランザクション属性のスクリプトからは呼び出すことができません。
|
呼び出し元トランザクションの引き継ぎは行いません。 |
トランザクションはサポートしません。 また、呼び出し元はトランザクションをサポートしていない必要があります。 |
NOTSUPPORTED (制限2) |
制限はありません。 すべてのトランザクション属性のスクリプトから呼び出すことができます。 |
呼び出し元トランザクションの引き継ぎは行いません。 |
トランザクションはサポートしません。 また、呼び出し元のトランザクション属性に関わらず、そのトランザクションには参加しません。 |
SUPPORTS (制限2) |
制限はありません。 すべてのトランザクション属性のスクリプトから呼び出すことができます。 |
|
デフォルトの動作は、トランザクションをサポートしません。 また、呼び出し元のトランザクション属性によって、サポートする/しないが変わります。 注意
スクリプトのトランザクション属性のデフォルト値です。 |
REQUIRED (制限2) |
制限はありません。 すべてのトランザクション属性のスクリプトから呼び出すことができます。 |
|
トランザクションをサポートします。 呼び出し元のトランザクション属性によって、動作が変わります。 |
REQUIRESNEW (制限2) |
制限はありません。 すべてのトランザクション属性のスクリプトから呼び出すことができます。 |
呼び出し元がトランザクションをサポートしている/していないに関わらず、新規にトランザクションを開始します。 |
トランザクションをサポートします。 常に新規にトランザクションを開始します。 |
MANDATORY (制限3) |
以下のトランザクション属性のスクリプトからは呼び出すことができません。
|
呼び出し元のトランザクションを引き継ぎ、同一のトランザクションとして動作します。 |
トランザクションをサポートします。 また、呼び出し元は、必ずトランザクションをサポートしていなくてはなりません。 |
親スクリプトと子スクリプトのトランザクション属性の関係一覧表
設定できるトランザクション属性の組み合わせは以下のとおりです。
トランザクション属性 |
設定の可否 |
|
---|---|---|
子スクリプト |
親スクリプト |
|
NEVER |
NEVER |
○ |
NOTSUPPORTED |
○ |
|
SUPPORTS |
○ |
|
REQUIRED |
× |
|
REQUIRESNEW |
× |
|
MANDATORY |
× |
|
NOTSUPPORTED |
NEVER |
○ |
NOTSUPPORTED |
○ |
|
SUPPORTS |
○ |
|
REQUIRED |
○ |
|
REQUIRESNEW |
○ |
|
MANDATORY |
○ |
|
SUPPORTS |
NEVER |
○ |
NOTSUPPORTED |
○ |
|
SUPPORTS |
○ |
|
REQUIRED |
○ |
|
REQUIRESNEW |
○ |
|
MANDATORY |
○ |
|
REQUIRED |
NEVER |
○ |
NOTSUPPORTED |
○ |
|
SUPPORTS |
○ |
|
REQUIRED |
○ |
|
REQUIRESNEW |
○ |
|
MANDATORY |
○ |
|
REQUIRESNEW |
NEVER |
○ |
NOTSUPPORTED |
○ |
|
SUPPORTS |
○ |
|
REQUIRED |
○ |
|
REQUIRESNEW |
○ |
|
MANDATORY |
○ |
|
MANDATORY |
NEVER |
× |
NOTSUPPORTED |
× |
|
SUPPORTS |
○ 注意
SUPPORTSが設定された呼び出し元スクリプトがトランザクションをサポートしている場合 |
|
REQUIRED |
○ |
|
REQUIRESNEW |
○ |
|
MANDATORY |
○ |
〇 |
: |
設定できます。 |
× |
: |
設定できません。 |
トランザクション属性の設定方法
トランザクション属性は、スクリプトのプロパティダイアログのトランザクションタブで設定できます。
トランザクションコンポーネント
HULFT Squareでは、トランザクションを、指定した処理ごとに設定できます。
トランザクションを、指定した処理ごとに設定する場合には、トランザクションコンポーネントを使用します。
トランザクションコンポーネントは常に新規のトランザクションを開始します。トランザクション属性のREQUIRESNEWと同様の動作となります。
コネクターのトランザクション
トランザクションをサポートしているコネクターは、コンポーネントアイコンごとにトランザクションが実行されます。
以下の条件を満たすコンポーネントアイコンは、同一のトランザクションで実行されます。
-
トランザクションをサポートしている同一のスクリプト内に配置された場合
-
同一のトランザクションコンポーネント内に配置された場合
XAリソースと非XAリソース
一部のコネクターのコネクションリソースにはXAリソースと非XAリソースがあります。
XAリソースとは、2フェーズコミット機能を有するグローバルトランザクションに対応したリソースのことで、非XAリソースとは2フェーズコミット機能を有さないリソースのことです。
グローバルトランザクション(分散トランザクションともいいます)とは、複数のリソースにまたがったトランザクションのことです。
XAリソースと非XAリソースのトランザクションの違い
XAリソースを使用したときと、非XAリソースを使用したときのトランザクションの違いは以下のとおりです。
-
非XAリソース使用時のトランザクションの流れ
-
トランザクションの開始
-
コミット/ロールバック
-
-
XAリソース使用時のトランザクションの流れ
-
トランザクションの開始
-
プリペア
-
コミット/ロールバック
-
XAリソースを使用した場合には、トランザクション完了前(コミットまたはロールバック前)に「プリペア」という処理が実行されます。このような処理を「2フェーズコミット」と呼びます。複数のリソースにまたがるトランザクションでは、このプリペア処理が重要な役割を果たします。
トランザクションの実例
複数のリソースにまたがるグローバルトランザクションを作成する場合、2フェーズコミットをサポートしているXAリソースの使用を推奨します。
XAリソースと非XAリソースの動作の違いを以下のスクリプト例で説明します。

上記スクリプトは、同一のトランザクションで処理されます。
また、このスクリプトの「書き込み2」の処理が非常に長く、「書き込み1」のコミット時にトランザクションタイムアウトが発生するとします。
-
非XAリソースの場合
-
トランザクション開始
-
「書き込み1」が成功
-
「書き込み2」が成功
→「書き込み2」が非常に長い
-
トランザクション全体が成功したので、「書き込み1」および「書き込み2」をコミット
-
「書き込み1」をコミット
トランザクションタイムアウトによりコミット失敗
-
「書き込み2」をコミット
コミット成功
-
図3.1 非XAリソースの場合
つまり非XAリソースの場合、トランザクションの原子性(「すべて成功」か「すべて失敗」のどちらか)が崩れた状態になる可能性があります。
-
-
XAリソースの場合
-
トランザクション開始
-
「書き込み1」が成功
-
「書き込み2」が成功
→「書き込み2」が非常に長い
-
トランザクション全体が成功したので、「書き込み1」および「書き込み2」をプリペア
-
「書き込み1」をプリペア
トランザクションタイムアウトを検出し、プリペア失敗
-
-
プリペア処理に失敗したので、トランザクションをロールバック
-
「書き込み1」をロールバック
-
「書き込み2」をロールバック
-
図3.2 XAリソースの場合
XAリソースの場合、プリペア処理で「書き込み1」でコミットできないことを検知し、たとえ「書き込み2」のプリペア処理が成功しても、トランザクション全体をロールバックさせます。そのため非XAリソースで発生したトランザクションの原子性を保つことができます。
-
ファイル系コネクターのトランザクション
ファイル系コネクターの書き込みのトランザクションは以下の流れで実装されています。
-
トランザクション開始
-
テンポラリファイルへの書き込み
-
指定された書き込み先がトランザクション開始時から更新されていないかどうかのチェック
→更新されていた場合には「XAException」が発生し、トランザクションが失敗します。
-
テンポラリファイルから指定された書き込み先へコピーを行い、テンポラリファイルを削除(コミット時)
→コネクターで指定された書き込み先ファイルが更新される
-
テンポラリファイルの削除(ロールバック時)
→コネクターで指定された書き込み先ファイルは更新されない
ファイル系コネクターの書き込み処理は、デフォルトではスクリプトのトランザクション属性に関わらずトランザクションを行いません。
トランザクションを行うためには、コンポーネントアイコンの右クリックメニューでプロパティを選択し、トランザクションタブのトランザクション処理を行うにチェックを入れてください。
トランザクションを有効にし、スクリプトがトランザクションに参加している場合にはそのトランザクションに参加し、スクリプトがトランザクションに参加していない場合にはコンポーネントごとのトランザクションになります。
ファイル系コネクターの書き込み処理でトランザクション参加時に、書き込み先のディレクトリーに書き込み権限がない、ネットワークの寸断などでコミットに失敗した場合にはロールバックが行われません。