Symfony: Транзакции.
Как известно известный фреймворк Symfony на php 5 использует ORM генератор Propel. Что мне нравиться в propel, так это то, что независимо от базы, будь то SQLite или MyISAM которые не поддерживают транзакций, propel для любой операции генерит методы, которые откатывают изменения в случае неудачи. То есть всегда есть
$con = Propel::getConnection(MyPeer::DATABASE_NAME);
$con->begin();
<some database actions>
$con->commit();
В случае неудачи произойдет откат $con->rollback();
Недавно наткнулся на то, что такие транзакции можно делать вручную не только для одного объекта, но и для сохранения как частного случая, целой цепочки объектов. Например:
try {
$con->begin();
$obj1->save($con);
$obj2->save($con);
MyPeer::doDelete($obj3, $con);
$con->commit();
} catch (Exception $e) {
$con->rollback();
throw $e;
}
По мотивам http://propel.phpdb.org/trac/wiki/Users/Documentation/1.2/HowTos/Transactions
