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

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