public function transaction($transaction)
{
$em = $this->getEntityManager();
$conn = $em->getConnection();
$conn->beginTransaction();
try {
$result = $transaction($em, $this);
$em->flush();
$conn->commit();
return $result;
} catch (Exception $e) {
$em->close();
$conn->rollback();
throw $e;
}
}