メソッド内で複数のトランザクションが処理されている場合、データの整合性を担保するために、try~catch
を利用することになると思います。
以下、Cake2からCake4への移行する際の参考例です。
Cakephp2: トランザクション例
try { $this->begin(); // なんか保存系の処理とか $this->commit(); } catch (Exception $e) { $this->rollback(); throw $e; }
トランザクションの処理の書き方は大体決まっているので、おおよそCake2で実装されているのは、例に示したような感じになると思います。
Cake4に移行する際は、モデルの場合、$this->getConnection()
すればよく、コントローラの場合は ConnectionManager::get()
を利用すればよいでしょう。
Cakephp4: トランザクション例: モデル
// メソッド内に記述 $dataSource = $this->getConnection(); try { if (!$this->save($this->getRequest()->getData())) { $dataSource->rollback(); throw new \Exception('処理に失敗しました'); } if (!$this->Logs->save()) { $dataSource->rollback(); throw new \Exception('ログ追加に失敗しました'); } $dataSourse->commit(); } catch (\Exception $e) { $dataSourse->rollback(); return $e->getMessage(); }
Cakephp4: トランザクション例: コントローラー
use Cake\Datasource\ConnectionManager; // クラスメソッド内などで try { $dataSource= ConnectionManager::get('default'); $dataSource->begin(); // なんか保存系の処理とか $dataSource->commit(); } catch (\Exception $e) { $dataSource->rollback(); return; } }