Phalcon5でDBにデータを登録する際に、トランザクションを使おうと思ってハマったのでメモ。
DBはMariaDB。
マニュアル見てやってもなぜか動かない…
マニュアルはこちら。
https://docs.phalcon.io/5.0/ja-jp/db-models-transactions
上から順番に試してみましたが、なぜかトランザクションが効かない…
Rollbackができるか以下のパターンで検証してみました。
まずは、$this->db->begin()のやつ。
$this->db->begin(); // $customerにデータ設定は省略 $result = $customer->save(); $this->db->rollback();
「PHP message: There is no active transaction」のエラーが発生。
トランザクションが開始されていないようです。
次は、TxManager()のやつ。
use Phalcon\Mvc\Model\Transaction\Manager as TxManager; $manager = new TxManager(); $transaction = $manager->get(); // $customerにデータ設定は省略 $result = $customer->save(); $transaction->rollback();
Rollbackされず、データが保存されました。
phalcon5でトランザクションを使う方法
参考になるのが、Phalcon5のマニュアルだとisolatedの2つ目の「Transactions can be used to delete a number of records, ensuring that everything is deleted correctly」のところ。
https://docs.phalcon.io/5.0/ja-jp/db-models-transactions#isolated
あとは、Phalcon3.4のマニュアルが参考になります。
https://docs.phalcon.io/3.4/ja-jp/db-models-transactions#isolated-transactions
当環境では、TxManager()でsetTransaction()を使うことでトランザクションが使えました。
use Phalcon\Mvc\Model\Transaction\Manager as TxManager; $manager = new TxManager(); $transaction = $manager->get(); $customer->setTransaction($transaction); // $customerにデータ設定は省略 $result = $customer->save(); $transaction->rollback();
これでRollbackされ、データが登録されませんでした。
複数データを登録する場合はこんな感じ。
use Phalcon\Mvc\Model\Transaction\Manager as TxManager; $manager = new TxManager(); $transaction = $manager->get(); // $customerにデータ設定は省略 $customer->setTransaction($transaction); $result = $customer->save(); // $robotにデータ設定は省略 $robot->setTransaction($transaction); $result = $robot->save(); $transaction->rollback();
これでRollbackできたので、登録失敗した場合にrollback()、成功した場合はcommit()するようにすればOK。
ちなみにMariaDB(MySQL)は、RollbackしてもAUTO_INCREMENTの値はRollbackされないので、連番ではなくなります。
2のデータ登録しようとした際にRollbackされたとすると、「1,3,4」みたいにデータができるので要注意。