У меня есть два отдельных модуля, которые можно использовать независимо, но модуль 2 зависит от модуля 1.
Модуль 2 имеет операцию, которая должна быть атомарной, и он вызывает операцию в модуле 1, которая также должна быть атомарной.
Предполагая, что я установил PDO :: ATTR_ERRMODE в PDO: ERRMODE_EXCEPTION, следующий сильно обобщенный и фрагментированный код дает это:
Неустранимая ошибка PHP: необработанное исключение «PDOException» с сообщением «Активная транзакция уже существует»
Module1:
<?php
class Module1
{
...
public function atomicOperation($stuff)
{
$this->pdo->beginTransaction();
try {
$stmt = $this->pdo->prepare(...);
...
$this->pdo->commit();
}
catch (Exception $ex) {
$this->pdo->rollBack();
throw $ex;
}
}
}
Module2:
<?php
class Module2
{
public $module1;
...
public function atomicOperation($stuff)
{
$this->pdo->beginTransaction();
try {
$stmt = $this->pdo->prepare(...);
...
$this->module1->atomicOperation($stuff);
...
$this->pdo->commit();
}
catch (Exception $ex) {
$this->pdo->rollBack();
throw $ex;
}
}
}
Я не уверен, что лучший способ это сделать - вложенная операция обязательно будет вызвана независимо, и абсолютно должна быть атомарной, если вызывается сама по себе. Нежелательно возлагать ответственность за управление транзакцией и сохранение атомарности на пользователя класса, поскольку я уверен, что пользователи класса никогда не будут применять его.