【cakephp】saveAllのトランザクション | Benefit Web Development&Designのブログ

Benefit Web Development&Designのブログ

ホームページ制作 ECサイト CMS構築を扱っていますベネフィットのブログです。ホームページ制作やリニューアルはもちろん、スマートフォンサイト制作やレスポンシブデザインのサイト制作などを提供しています。

テーマ:
こんにちは!


今日は、PHPでのweb開発ではおなじみのフレームワークcakePHPについて...


今回気になったのは、コントローラやモデルのビジネスロジック内でロープの中で、INSERTやUPDATEを
行う事ってよくありますよね...

その中で、ループの途中で配列の構成や変数の初期化抜けとかが原因でSQLがこけた場合って、
フレームワーク側でちゃんとロールバックって保障してくれるのかが気になりました...

また、明示的に$this->beginや$this->commitした時に、ベースクラスでのトランザクションには影響ってないのかなとか...


現在進行中のプロジェクトはcakeで開発をしているのですが、掲題の通り、DB編集においてのトランザクションの挙動を見てみました。

当初、マニュアルには

saveMany( )

atomic: If true (default), will attempt to save all records in a single transaction. Should be set to false if database/table does not support transactions.

⇒savaMany()でのオプション[atomic]のデフォルトはtrue単一トランザクションの全てのレコードを保存しようとします...

なんか、この翻訳だと、トランザクション内でさらにトランザクション(begin)をスタートした場合も、単一のトランザクションとして動作するみたいな、感じ

モデルのベースクラスを追っかけてみると、

まず、一回のプロセスの中で、初めてトランザクションを開始した時にcakeでは内部的にトランザクションがスタートしているかと、トランザクションの深さを保持します。

その後に、再度明示的にsaveMany()やsaveAll()でatomicにfalseを指定しなくても、トランザクションのコミットはされないようです。(ネストされたトランザクションの深さをデクリメントしていて、そのプロセスで生成されたDB接続インスタンスにはコミット命令はだされませないようです。)

少々深い話になってしましましたが、フレームワーク側に任せて、トランザクションを意識しないでコーディングできる事は助かりますよね...
AD