[Cake]CakePHPで意識の低いトランザクション commit rollback
cakeで複数のテーブルにまたがったトランザクション管理をしたい。
ただ、個人的にcakephpを使うとき、あまり規約に従って作ってなくて、db操作もmodel->query()を使いまくっている。
そのときにcommitとかrollbackとか、どうすれば出来るべなと確認。
やり方
基本的にはやっぱりquery()でbeginとかcommitとか発行すればOK。
#Modelにメソッドを用意
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/** * transaction begin */ public function begin_transaction(){ $sql = "BEGIN; "; $this->query($sql); } /** * commit */ public function commit(){ $sql = "COMMIT"; $this->query($sql); } /** * rollback */ public function rollback(){ $sql = "ROLLBACK;"; $this->query($sql); } |
#Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$this->Campaign->begin_transaction(); // 異なるテーブルの登録処理(modelでqueryでがっつり発行) $res = []; $res[] = $this->Campaign->save_table1($data); $res[] = $this->Campaign->save_table2($data); if(in_array(false, $res)){ $this->Campaign->rollback(); //$this->redirect('error'); }else{ $this->Campaign->commit(); } |
ちなみに、cakeでもExceptionは普通のtry catchでOK。
#例外があったらfalse
1 2 3 4 5 6 7 8 |
#cake内での try catch 例 try{ $this->query($sql, $param) ; return true; }catch (Exception $e){ return false; } |
#例外があったら、そのまま例外を投げる。
こっちだと、上でtry-catchで拾えてcommit,rollbackの制御が出来る。
1 2 3 4 5 6 7 |
try{ $this->query($sql, $param) ; return true; }catch (Exception $e){ throw $e; //例外をそのまま投げる。 } |
またトランザクション中にハンドリングしていない例外が発生しても、コミットはされない。よかた。
関連記事
-
-
クロームでブラウザ・端末エミュレート機能の使い方。えらく見つけづらくなった。。
クロームのエミュレーターが見つけづらくなったのでメモ。 ①デベロッパーツールを開 …
-
-
【PHP】【Slim】インストールー手動ダウンロード と Composer
ずーっと思ってた、CakeとかCodeIgnaitorとか、俺には多機能すぎる! …
-
-
CakePHPでjoinしようとしたときのエラー 【Notice (8): Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1714]】
Cakeでfind()からjoinしようとしたときに下記Noticeが出て、検索 …
-
-
phpでImageMagickを使うための各種インストール
phpからImageMagickを使いたい。peclのimagickをインストー …
-
-
phpでsimplexml_load_fileを使ってハマった所
スクレイピングの一歩としてrssをパースしようとした。 その時「simplexm …