Phalcon5でDBにデータを登録する際に、トランザクションを使おうと思ってハマったのでメモ。
DBはMariaDB。
マニュアル見てやってもなぜか動かない…
マニュアルはこちら。
https://docs.phalcon.io/5.0/ja-jp/db-models-transactions
上から順番に試してみましたが、なぜかトランザクションが効かない…
Rollbackができるか以下のパターンで検証してみました。
まずは、$this->db->begin()のやつ。
1 2 3 4 5 6 | $this ->db->begin(); // $customerにデータ設定は省略 $result = $customer ->save(); $this ->db->rollback(); |
「PHP message: There is no active transaction」のエラーが発生。
トランザクションが開始されていないようです。
次は、TxManager()のやつ。
1 2 3 4 5 6 7 8 9 | 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()を使うことでトランザクションが使えました。
01 02 03 04 05 06 07 08 09 10 11 | use Phalcon\Mvc\Model\Transaction\Manager as TxManager; $manager = new TxManager(); $transaction = $manager ->get(); $customer ->setTransaction( $transaction ); // $customerにデータ設定は省略 $result = $customer ->save(); $transaction ->rollback(); |
これでRollbackされ、データが登録されませんでした。
複数データを登録する場合はこんな感じ。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 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」みたいにデータができるので要注意。