[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; //例外をそのまま投げる。 } |
またトランザクション中にハンドリングしていない例外が発生しても、コミットはされない。よかた。
関連記事
-
-
CentOSをインストールしたときにいつも最初にやること(apache mysql phpのインストール)
SElinuxの無効化 iptableの無効化 apacheのインストール・自動 …
-
-
【PHP】【Slim】インストールー手動ダウンロード と Composer
ずーっと思ってた、CakeとかCodeIgnaitorとか、俺には多機能すぎる! …
-
-
【PHP】【Slim】テンプレートの利用
テンプレートの利用 【参考】PHPマイク …
-
-
クロームでブラウザ・端末エミュレート機能の使い方。えらく見つけづらくなった。。
クロームのエミュレーターが見つけづらくなったのでメモ。 ①デベロッパーツールを開 …
-
-
自然順と辞書順のソートの違い
本ページの内容は下記リンクに集約しました。 http://www. …