トランザクション
Propelは列の削除や関連した列をカスケード削除(cascade delete)のようなアトミックアクションをカプセル化するために内部でトランザクションを使用します。Propelで独自のトランザクションポイントを指定することも出来ます。
Propelは独自のトランザクションポイントを使うことが出来ます。ネストされたトランザクションをサポートしないデータベース(SQLiteなど)のために、Propelのメソッドの外側で指定されたトランザクションポイントが優先されます(ネストされたbegin/commit文はネストされたトランザクションをサポートしないドライバによって無視されます)。
独自のトランザクションポイントを設定するために、CreoleのConnectionオブジェクトを取得してbegin()とcommit()メソッドをあなた自身で呼び出す必要があります。
// PropelからConnectionオブジェクトを取得する
$con = Propel::getConnection(MyPeer::DATABASE_NAME);
try {
$con->begin();
$obj1->save($con);
$obj2->save($con);
MyPeer::doDelete($obj3, $con);
$con->commit();
} catch (Exception $e) {
$con->rollback();
throw $e;
}
}
上記の例においてsave()もしくはdoDelete()メソッドのどちらかが例外をスローして(すなわち削除のアクションを実行できない)命令文の全体のグループがロールバックされます。
上記の例において$conはsave()とdelete()メソッドに渡されることに留意して下さい。これは技術的に不必要です。というのもトランザクションはPropel::getConnection()(PHP5においてすべては参照されることを覚えておいて下さい)によって返されるConnectionオブジェクトで始まっていますが、使用されている外部の接続がある場合接続に渡すリマインダとして便利であると思います(この場合、トランザクションは始まります)。また、それはメソッド範囲内でPropel::getConnection()への不必要な呼び出しを避けます。
制限
現在SELECT blah FOR UPDATEはサポートされておらず、Propel 2.0で修正される予定です。
