
トランザクションの使いどころといえば、データの整合性を担保するために、複数の処理をひとまとめにしたい場合などが考えられると思います。
例えば、通常データの保存に加えて、同時にログデータも保存しておく、さらに関連データも別で処理したい、など。
で、このトランザクション実装時に少し沼った話ですが、保存処理がうまくできなかった場合に例外を投げ、例外メッセージを受け取り、それをフラッシュにセット、データはロールバックし、元の通りが期待される実装をしていました。
Cake4: トランザクション実装例
use Cake\Datasource\ConnectionManager;
// クラスメソッド内にて
try {
$dataSource= ConnectionManager::get('default');
$dataSource->begin();
if (!$this->save($this->getRequest()->getData())) {
throw new \Exception('処理に失敗しました');
}
if (!$this->saveLog($this->getRequest()->getData())) {
throw new \Exception('ログ追加に失敗しました');
}
$dataSource->commit();
} catch (\Exception $e) {
$dataSource->rollback();
$this->Flash->error($e->getMessage());
return;
}
で、ここで、先にトランザクションで処理を囲ってしまうと、実装時のデバッグで exit など処理を中断すると、ロールバックされてデータが保存されないように見えてしまい、「なんでじゃああああ!」ってなるのですが、気がついた時には至極当たり前の事。戒めも含めて記事にしておこうと思いました。(くそー)