トランザクションを実行するには、テーブルの種類がトランザクションをサポートしている必要があります。
全てのトランザクションメソッドは、モデルのデータソースオブジェクトが実行しなければなりません。 モデルの内部でデータソースを取得するには、以下を使用してください。
$dataSource = $this->getDataSource();
これで、データソースを用いてトランザクションを開始・コミット・ロールバックすることが できるようになりました。
$dataSource->begin();
// 幾つかのタスクを実行する
if (/*すべて成功*/) {
$dataSource->commit();
} else {
$dataSource->rollback();
}
Datasource::begin()
メソッドによって、トランザクションを複数回開始することができます。
トランザクションは、 begin
と一致する commit
と rollback
の回数だけ実行されるでしょう。
$dataSource->begin();
// 幾つかのタスクを実行する
$dataSource->begin();
// さらに幾つかのタスク
if (/*最後のタスクが完了*/) {
$dataSource->commit();
} else {
$dataSource->rollback();
// メインタスクの処理を変更する
}
$dataSource->commit();
もしデータベースがネスト化されたトランザクションをサポートし、それをデータソース内で行うことが できるなら、ネスト化されたトランザクションを実行できるでしょう。 ネスト化されたトランザクションをサポートしないか利用できない場合、このメソッドは常に true を返します。
もし複数の begin を使いたいがデータベースのネスト化されたトランザクションを使いたくないなら、
$dataSource->useNestedTransactions = false;
とすることでそれを無効にします。
その場合には、グローバルトランザクションだけを使うことができます。
ネスト化されたトランザクションはデフォルトでは利用不可となっています。これを使うためには、
$dataSource->useNestedTransactions = true;
として下さい。