>>271はややこしいので、さらに簡素化させて再現できました。
hello()は存在しない関数です。

try {
$db = new PDO('sqlite:test.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
foreach ($db->query('select * from hoge') as $row) {
hello();
}
$db->commit();
} catch (PDOException $e) {
try {
$db->rollBack();
} catch (PDOException $e) {
}
}

どうやら、foreachで取るところの中でエラーが起きるとまずいようです。
PDO::queryの例として紹介されてるやり方なんですが、なぜこんなことに・・・
http://www.php.net/manual/ja/pdo.query.php