Apexのトランザクション制御
前回、ApexのDMLステートメントと失敗時の挙動の説明で、ロールバックの話が出たので、今回はApexのトランザクション制御の特性を紹介します。
トランザクションの開始
Apexスクリプトの開始と同時にトランザクションが開始されます。明示的にトランザクションを開始することはできないので、注意が必要です。
コミット
Apexスクリプトが正常終了すると、コミットされます。これも明示的にコミットすることはできないので、注意が必要です。
セーブポイント
Database.setSavePoint()をコールして、セーブポイントを設定できます。
ロールバック
Apexスクリプトが異常終了すると、ロールバックされます。
明示的にロールバックするには、Database.rollback(savepoint)をコールします(セーブポイントへのロールバックしかできません)。
以上のように、明示的に制御できるのは、セーブポイントの設定とロールバックだけで、他はApexが正常終了したか異常終了したかによって、自動的に行われます。きめ細かく制御できないので、この特性を理解した上でプログラムを組む必要があります。
最後に、トランザクション中での行ロックの取得方法と、Force.comプラットフォームでのトランザクションの分離レベルについて、紹介しておきます。
行ロックの取得
Apexコード中で実行するSOQLクエリに「For Update」キーワードを付けて、行ロックを取得することができます。行ロックはトランザクションがコミットまたはロールバックされるまで持続されます。
例) Select Id From Account For Update
トランザクションの分離レベル
Force.comプラットフォームのトランザクションの分離レベルは、コミット済み読み取り(READ COMMITTED)で、変更することはできません。
更新したがまだコミットされていないデータは、他のトランザクションからは読み取られません。あるトランザクションが更新中のレコードを他のトランザクションが読み取ろうとしたときは、更新中トランザクションが終了するまで一定時間待ちます。一定時間を過ぎた場合は待っている方のトランザクションが失敗します。
※トランザクションの分離レベルについては、ここを参照のこと
コメント