すべてのトランザクションは、現在の DataSource オブジェクトで実行されます。
まず、(モデルで)それを取得する必要があります:
$dataSrc = $this->getDataSource();
このメソッドは、現在モデルにバインドされている DataSource オブジェクトを返します。
次に、DataSource オブジェクトのメソッドを使用して、トランザクションを開始、コミット、またはロールバックできます。
$dataSrc->begin();
//Do something
if (/*Everything is nice?*/) {
$dataSrc->commit();
} else {
//Bad things have happened
$dataSrc->rollback();
}
もちろん、独自のロジックを実装する必要があります。Cake 2.2以降では、実際のネストされたトランザクションも実行できます。ウィキペディアによると、「ネストされたトランザクション」は次のとおりです。
ネストされたトランザクションは、既存のトランザクション内に既にある命令によって新しいトランザクションが開始されたときに発生します。新しいトランザクションは、既存のトランザクション内にネストされていると言われるため、この用語が使われています。ネストされたトランザクションは、データベースごとに異なる方法で実装されます。ただし、最も外側のトランザクションがコミットされるまで、無関係なトランザクションには変更が表示されないという共通点があります。これは、内部トランザクションのコミットがデータベースへの更新を保持する必要がないことを意味します。
もちろん、これはすべて、使用しているデータベースに依存しています。MySQL InnoDBトランザクションストレージ エンジンは、トランザクションをサポートしています。
そして、このコメントに対する別の説明:
はい、コントローラーで $this->Model->saveAll($this->request->data, array('deep' => true) を使用しています。これは foreach ループの下に記述されています。最後の foreach レコードのみデータベースに保存されます. – Arun Jain
$this->Model->saveAll();
ループで実行する必要はありません! 「自動的に」物事を管理します。ループから外します。さらに、saveAll() でデータを保存するのではなく、トランザクションに関する質問でした。Model::saveAll()は、 saveMany()とsaveAssociated( )の単なるラッパーです。モデルの関連付けのタイプに応じて、使用するメソッドが選択されます。
Cake Bookを読んでください。そこにはすべて非常によく説明されています...