Я понимаю, как работают транзакции, и все работает, как и ожидалось, но мне не нравится способ доступа к соединениям для фиксации или отката транзакций.
У меня есть 3 класса обслуживания, которые могут обращаться к одному объекту одноэлементного соединения. Я хочу обернуть эти три вещи в одну транзакцию, поэтому я делаю это:
try {
$service1 = new ServiceOne;
$service2 = new ServiceTwo;
$service3 = new ServiceThree;
$service1->insertRec1($data);
$service2->deleteRec2($data);
$service3->updateRec3($data);
$service1->getSingletonConnection()->commit();
}
catch(Exception $ex) {
$service1->getSingletonConnection()->rollback();
}
Объект соединения, возвращаемый getSingletonConnection, является просто оболочкой для соединения oci8, а фиксация - oci_commit
; Откат составляет oci_rollback
.
Как я уже сказал, это работает, потому что все они получают доступ к одному и тому же соединению, но кажется неправильным доступ к соединению через любой произвольный объект службы. Кроме того, в моем приложении используются две разные базы данных, поэтому мне нужно быть уверенным, что я получаю и фиксирую правильную базу данных ... хотя я и не уверен, есть ли способ обойти это.
Есть ли лучший способ обработки транзакций?