原则2:事务不起作用


Doctrine 2: Transaction does not work

由我的请求处理的代码(只是测试目的):

$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. Before requests: Number is 30
  2. 请求1被触发
  3. 请求2被触发
  4. 请求1完成。编号为31请求2完成。

我期望在完成第二个请求后32,因为事务集中有写锁。为什么这行不通呢?

编辑:我必须添加$em->refresh($entity)才能使其工作。但我想知道我是否必须每次都手动执行

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