Php 原则2:交易无效

Php 原则2:交易无效,php,nginx,doctrine-orm,Php,Nginx,Doctrine Orm,由我的请求处理的代码(仅用于测试目的): 当我启动两个请求(由不同的Nginx子级处理)时,会发生以下情况: 请求前:号码是30 请求1被触发 请求2被触发 请求1已完成。电话号码是31 请求2已完成。数字为31 我希望在完成第二个请求后32,因为事务集中有写锁。为什么这不起作用 编辑:我必须添加$em->refresh($entity)才能让它工作。但是我想知道我是否每次都必须手动执行此操作。似乎执行$em->refresh($entity)的解决方案就是这样做的。我问了Doctrine 2的

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

当我启动两个请求(由不同的Nginx子级处理)时,会发生以下情况:

  • 请求前:号码是30
  • 请求1被触发
  • 请求2被触发
  • 请求1已完成。电话号码是31
  • 请求2已完成。数字为31
  • 我希望在完成第二个请求后32,因为事务集中有写锁。为什么这不起作用


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

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

    看来解决方案是通过执行
    $em->refresh($entity)
    来实现。我问了条令2的开发者

    $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;
    }