トランザクションがどのように機能し、すべてが期待どおりに機能するかは理解していますが、トランザクションをコミットまたはロールバックするために接続にアクセスする方法が好きではありません。
同じシングルトン接続オブジェクトにアクセスできる 3 つのサービス クラスがあります。これら 3 つのことを 1 つのトランザクションでラップしたいので、次のようにします。
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
。
前述したように、これはすべて同じ接続にアクセスしているため機能しますが、任意のサービス オブジェクトを介して接続にアクセスするのは間違っていると感じます。また、私のアプリでは 2 つの異なるデータベースが使用されているため、正しいデータベースを取得してコミットする必要がありますが、それを回避する方法があるかどうかはわかりません。
トランザクションを処理するためのより良い方法はありますか?