gpt4 book ai didi

doctrine-orm - 如何避免在发生 OptimisticLockException 时关闭 EntityManager?

转载 作者:行者123 更新时间:2023-12-01 09:30:42 31 4
gpt4 key购买 nike

我的问题 - 进程尝试更改已经更改并具有最新版本 ID 的实体。当我在 UnitOfWork 的 commit() 代码中执行 flush() 时,会出现 OptimisticLockException 并通过 catch-all block 在同一位置捕获。并在此 catch 学说中关闭 EntityManager。如果我想跳过这个实体并继续 ArrayCollection 中的另一个实体,我不应该使用 flush()?

尝试重新创建 EntityManager:

}catch (OptimisticLockException $e){
$this->em = $this->container->get('doctrine')->getManager();
echo "\n||OptimisticLockException.";
continue;
}

仍然得到

[Doctrine\ORM\ORMException]   
The EntityManager is closed.

奇怪。

如果我这样做

$this->em->lock($entity, LockMode::OPTIMISTIC, $entity->getVersion());

然后执行 flush() 我得到 OptimisticLockException 并关闭实体管理器。如果我这样做

$this->getContainer()->get('doctrine')->resetManager();
$em = $doctrine->getManager();

旧数据未在该实体管理器中注册,我什至无法在数据库中写入日志,出现错误:

[Symfony\Component\Debug\Exception\ContextErrorException]  
Notice: Undefined index: 00000000514cef3c000000002ff4781e

最佳答案

您应该在尝试刷新之前检查实体版本以避免异常。换句话说,如果锁定失败,您不应该调用 flush() 方法。

您可以使用 EntityManager#lock() 方法来检查您是否可以刷新实体。

    /** @var EntityManager $em */
$entity = $em->getRepository('Post')->find($_REQUEST['id']);

// Get expected version (easiest way is to have the version number as a hidden form field)
$expectedVersion = $_REQUEST['version'];

// Update your entity
$entity->setText($_REQUEST['text']);

try {
//assert you edit right version
$em->lock($entity, LockMode::OPTIMISTIC, $expectedVersion);

//if $em->lock() fails flush() is not called and EntityManager is not closed
$em->flush();
} catch (OptimisticLockException $e) {
echo "Sorry, but someone else has already changed this entity. Please apply the changes again!";
}

查看 Doctrine 文档中的示例 optimistic locking

关于doctrine-orm - 如何避免在发生 OptimisticLockException 时关闭 EntityManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32263334/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com