
今日は、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接続インスタンスにはコミット命令はだされませないようです。)
少々深い話になってしましましたが、フレームワーク側に任せて、トランザクションを意識しないでコーディングできる事は助かりますよね...