Transactions
The framework fully supports transaction, as long as the caller uses the methods provided by the entity manager.
Semantics
- Immediate events are dispatched immediately as usual.
- Pre-flush events will be dispatched before every
flush()regardless of the transaction status. - Post-flush events will be dispatched after the outermost
commit(). rollback()clears the pending post-flush events collected during the transaction, but retains the events collected before the transaction.- The events are collected only on
flush().
Managing Transaction Using DBAL is not Supported
warning
Doing the transaction by hand using DBAL's Connection is not supported. Always
do the transaction using entity manager's methods of beginTransaction(),
commit(), rollback(), transactional() and wrapInTransaction().
Don't do like this snippet taken from Doctrine's documentation:
// warning: don't do this
$em->getConnection()->beginTransaction(); // 👎
try {
// ... do some work
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
$em->getConnection()->commit(); // 👎
} catch (Exception $e) {
$em->getConnection()->rollBack(); // 👎
throw $e;
}
Instead, do this:
$em->beginTransaction(); // 👍
try {
// ... do some work
$user = new User;
$user->setName('George');
$em->persist($user);
$em->flush();
$em->commit(); // 👍
} catch (Exception $e) {
$em->rollback(); // 👍
throw $e;
}