モデル内で処理することを想定し、Memberモデル内に書いている。
例としてmembersテーブルに$dataを保存する処理
public function saveNewMember() {
$datasource = $this->getDataSource();
try{
$datasource->begin();
$data = array(
'Member' => array(
'name' => 'maeda',
'email' => 'maeda@sample.com',
));
if (!$this->save($data)) {
throw new Exception();
}
$datasource->commit();
} catch(Exception $e) {
$datasource->rollback();
}
}
こうした場合、以下のようになる。
1 BEGIN
2 INSERT INTO "public"."members" ("name", "email") VALUES ('maeda', 'maeda@sample.com')
3 COMMIT
2つ目の処理を追加する。(別モデルにしてみる)
てっぺんに以下追加しておいて、
App::uses('Comment', 'Model');
public function saveNewMember() {
$this->Comment = new Comment();// 別モデル読み込み
$datasource = $this->getDataSource();
try{
$datasource->begin();
$data = array(
'Member' => array(
'name' => 'maeda',
'email' => 'maeda@sample.com',
));
if (!$this->save($data)) {
throw new Exception();
}
$data = array(
'Comment' => array(
'post_id' => '4',
'comment' => 'res3-1',
));
if (!$this->Comment->save($data)) {
throw new Exception();
}
$datasource->commit();
} catch(Exception $e) {
$datasource->rollback();
}
}
以下のように動作する。
1 BEGIN
2 INSERT INTO "public"."members" ("name", "email") VALUES ('maeda', 'maeda@sample.com')
3 INSERT INTO "public"."comments" ("post_id", "comment") VALUES (4, 'res3-1')
4 COMMIT
Commentのpost_idに数字以外を入れて失敗させる。以下のようになる。
1 BEGIN
2 INSERT INTO "public"."members" ("name", "email") VALUES ('maeda', 'maeda@sample.com')
3 ROLLBACK
つまり同じデータソースの場合は同じトランザクションになる。