原则2:交易不起作用

时间:2015-10-08 20:49:08

标签: php nginx doctrine-orm

我的请求处理的代码(仅用于测试目的):

$em->beginTransaction();
try {
    $repository = $em->getRepository(User::class);
    /** @var User $entity */
    $entity = $repository->findOneBy(['user' => 1]);
    $em->lock($entity, LockMode::PESSIMISTIC_WRITE);
    // $em->refresh($entity); Would solve the problem. See edit at bottom.
    $entity->increase(1); // just an integer field will be increased

    sleep(2);

    $em->persist($entity);

    $em->flush();
    $em->commit();
} catch (\Exception $e) {
    $em->rollback();
    throw $e;
}

当我发出两个请求(由不同的Nginx孩子处理)后发生:

  1. 请求前:数字为30
  2. 请求1被解雇
  3. 请求2被解雇
  4. 请求1已完成。号码是31
  5. 请求2完成。号码 31
  6. 由于在事务集内部存在写锁,因此在完成第二个请求后我希望 32 。为什么这不起作用?

    编辑:我必须添加$em->refresh($entity)才能使其正常运行。但是我想知道每次都必须手动完成。

1 个答案:

答案 0 :(得分:0)

似乎做$em->refresh($entity)的解决方案就是这样做的。我问过Doctrine 2开发人员。