Phalcon5のトランザクションでハマった!Rollbackできない、トランザクションが始まらない問題。

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」みたいにデータができるので要注意。