質問: FALSE;`をすることを想定しています。 ### 試したこと hookの機能を利用し、`post_controller_constructor`でトランザクションの開始、`post_controller`でトランザクションの完了処理を試しました。 url_helperの`redirect()`などで`exit`した場合に、トランザクションの完了処理が呼ばれず、結果としてロールバックされてしまいました。 ### 補足情報(言語/FW/ツール等のバージョンなど) CodeIgniter 3.1.4 MySQL よろしくお願いします。
回答: がると申します。 CodeIgniterに長けているわけではないので、「PHPの一般論として」程度のお話、になるのですが。 デストラクタは「特定のオブジェクトを参照するリファレンスがひとつもなくなったとき」または「スクリプトの終了時」にcallされますが。 特にスクリプトの終了時には「順不同で」callされるので。 また、「$this->db->」とあるので、「$this->db」には何がしかのDB接続系インスタンス(PDOとかですかねぇ?)が入っている、と予見されるので。 上述から * 順不同なので「$this->dbのデストラクタ」が先にcallされる可能性 が十分に予見されるので、そうすると * $this->dbのデストラクタが動く(=DB接続が切られる:トランザクション中であれば、rollbackされる) * MY_Controllerクラスのデストラクタがcallされる時には「DB接続が切れている」ので、commitはできない といった流れが、可能性として予見されるように思われます。 少々斜めにぐぐってみたのですが......ほかのフレームワークだと定期的にみられる、例えば「afterFilter」的なメソッドが、ざっくり検索した限りだと、見当たらないようなので。 そのあたりを自作するか、或いはサポートされている機能として実はあるのであれば、その辺を使うか、といった感じの箇所にcommit系の処理を書くと、比較的穏当に動くのではないか、と思うのですが如何でしょうか?