Transactionオブジェクト
コンポーネント情報 | |
---|---|
version | 8.0 |
スクリプト開発からトランザクションを制御するためのクラスです。
トランザクションはスレッド単位であるため、スレッド毎に情報を持つ必要があることに注意してください。
begin が関数を受け取れるようになっています。関数を受け取る場合、commit 漏れや rollback 漏れを予防できるため、こちらを推奨します。
例1:
例2:
例3:
例4:
例5:
例6:
例7:
例8:
下記の例では forward を使用していますが、redirect, Debug.browse 等のページ遷移を行うその他 API にも対しても、下記と同様に動作します。
トランザクションはスレッド単位であるため、スレッド毎に情報を持つ必要があることに注意してください。
begin が関数を受け取れるようになっています。関数を受け取る場合、commit 漏れや rollback 漏れを予防できるため、こちらを推奨します。
例1:
- begin に関数を渡さない場合
Transaction.begin(); var succeeded = doSomething(); if (succeeded) { Transaction.commit(); } else { Transaction.rollback(); } Debug.print('トランザクション終了');
- begin に関数を渡す方法で実装した場合(こちらを推奨します)
Transaction.begin(function() { // この関数内でのみ、トランザクションが張られます var succeeded = doSomething(); if (!succeeded) { Transaction.rollback(); // この時点ではロールバックされませんが、rollback が呼び出されたことが API 内部で記録されます } Debug.print('トランザクション終了'); }); // この時点で、引数の関数中で、rollback が呼ばれている場合は rollback が自動的に呼ばれ、そうでない場合には commit が自動的に呼ばれています。この例では、rollback が呼ばれています
例2:
assertFalse(Transaction.isTransaction().data); // トランザクションが張られていないので、false になります Transaction.begin(); Transaction.begin(); // 既にトランザクション中なので、何も行いません assertTrue(Transaction.isTransaction().data); // トランザクション中なので、true になります Transaction.commit(); Transaction.rollback(); // トランザクションが終了しているので、何も行いません Transaction.commit(); // トランザクションが終了しているので、何も行いません
例3:
Transaction.begin(function() { assertTrue(Transaction.isTransaction().data); // トランザクション中なので、true になります Transaction.begin(); // トランザクションが終了しているので、何も行いません Transaction.commit(); // この時点では commit は呼ばれません Transaction.rollback(); // この時点では rollback は呼ばれませんが、rollback が呼び出されたことが API 内部で記録されます }); // 引数の関数内で rollback が呼ばれているため、この時点で rollback が自動的に呼ばれています
例4:
var result = Transaction.begin(function() { return 'hoge'; // 関数内で return した値が、begin の戻り値になります }); assertThat(result.data, is('hoge')); //-> result.data は hoge になります
例5:
Transaction.begin(function() { // この時点で begin が自動的に呼ばれています Transaction.begin(function() { // 既にトランザクションが有効なため、何も行いません(begin も commit も rollback も呼ばれません) var result = doSomething(); if (!result) { Transaction.rollback(); // この時点では rollback は呼ばれませんが、rollback が呼び出されたことが API 内部で記録されます } }); // ネストされた begin が終了した時点では、何も行いません(commit も rollback も呼ばれません) }); // 一番外側のの begin を抜けたので、commit (もしくは rollback)が自動的に呼ばれています
例6:
var exception = false; try { Transaction.begin(function() { throw new Error('aiueo'); hoge(); // 直前で例外が投げられているので、hoge(); は決して実行されません }); // 関数中で例外が投げられたので、rollback が自動的に呼ばれます } catch (e) { // 関数内で発生した例外は、そのまま begin から外に搬出されます // この時点で、rollback が自動的に呼ばれています exception = true; assertThat(e.message, is('aiueo')); //-> e.message は aiueo になります } assertTrue(exception);
例7:
Transaction.begin(function() { assertFalse(Transaction.toBeRollbacked()); // rollback が呼ばれていないため、false になります Transaction.begin(function() { // 既にトランザクションが有効なため、何も行いません(begin も commit も rollback も呼ばれません) assertFalse(Transaction.toBeRollbacked()); // rollback が呼ばれていないため、false になります Transaction.rollback(); assertTrue(Transaction.toBeRollbacked()); // ロールバックが呼ばれているのため、true になります }); // ネストされた begin が終了した時点では、何も行いません(commit も rollback も呼ばれません) assertTrue(Transaction.toBeRollbacked()); // ロールバックが呼ばれているのため、true になります });
例8:
下記の例では forward を使用していますが、redirect, Debug.browse 等のページ遷移を行うその他 API にも対しても、下記と同様に動作します。
Transaction.begin(function() { var result = ...; if (result.error) { Transaction.rollback(); // この時点では rollback は呼ばれませんが、rollback が呼び出されたことが API 内部で記録されます forward('error_page'); // この時点で直ちに処理が終了し、かつ rollback が呼ばれていたため、実際に rollback が自動的に呼ばれトランザクションが終了し、'error_page' に遷移します } else { forward('list_page'); // この時点で直ちに処理が終了し、かつ commit が自動的に呼ばれ、'list_page' に遷移します } });
メソッドの概要
返却値の型 | メソッド名 |
---|---|
DatabaseResult | begin (Function [operation] ) staticデータベーストランザクションを開始します。 |
DatabaseResult | commit () static データベーストランザクションをコミットします。 |
DatabaseResult | isTransaction () static トランザクションの状態を取得します。 |
DatabaseResult | rollback () static データベーストランザクションをロールバックします。 |
DatabaseResult | toBeRollbacked () static データベースがロールバックされる予定であるかを返します。 |
メソッドの詳細
DatabaseResult begin (Function [operation] )
static
データベーストランザクションを開始します。
operationが受け渡された場合は operation 関数内のみトランザクションが有効です トランザクションが既に開始済みであれば何も行いません
パラメータ
返却値
|
DatabaseResult commit ()
static
データベーストランザクションをコミットします。
返却値
|
DatabaseResult isTransaction ()
static
トランザクションの状態を取得します。
返却値
|
DatabaseResult rollback ()
static
データベーストランザクションをロールバックします。
返却値
|
DatabaseResult toBeRollbacked ()
static
データベースがロールバックされる予定であるかを返します。
返却値
|