diff --git a/lib/Doctrine/ORM/EntityManager.php b/lib/Doctrine/ORM/EntityManager.php index bbb564386a7..ebf7cab0c80 100644 --- a/lib/Doctrine/ORM/EntityManager.php +++ b/lib/Doctrine/ORM/EntityManager.php @@ -700,6 +700,7 @@ public function remove($entity) * * @throws ORMInvalidArgumentException * @throws ORMException + * @throws TransactionRequiredException */ public function refresh($entity, $lockMode = null) { diff --git a/lib/Doctrine/ORM/UnitOfWork.php b/lib/Doctrine/ORM/UnitOfWork.php index 5ff3702dcf6..f2a6e752244 100644 --- a/lib/Doctrine/ORM/UnitOfWork.php +++ b/lib/Doctrine/ORM/UnitOfWork.php @@ -2188,6 +2188,7 @@ private function doDetach( * @return void * * @throws InvalidArgumentException If the entity is not MANAGED. + * @throws TransactionRequiredException */ public function refresh($entity, $lockMode = null) { @@ -2204,9 +2205,18 @@ public function refresh($entity, $lockMode = null) * @psalm-param LockMode::*|null $lockMode * * @throws ORMInvalidArgumentException If the entity is not MANAGED. + * @throws TransactionRequiredException */ private function doRefresh($entity, array &$visited, $lockMode = null): void { + switch(true) { + case $lockMode === LockMode::PESSIMISTIC_READ: + case $lockMode === LockMode::PESSIMISTIC_WRITE: + if (! $this->em->getConnection()->isTransactionActive()) { + throw TransactionRequiredException::transactionRequired(); + } + } + $oid = spl_object_id($entity); if (isset($visited[$oid])) {