由我的请求处理的代码(只是测试目的):
$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子节点处理)时会发生以下情况:
- Before requests: Number is 30
- 请求1被触发
- 请求2被触发 请求1完成。编号为31请求2完成。
我期望在完成第二个请求后32,因为事务集中有写锁。为什么这行不通呢?
编辑:我必须添加$em->refresh($entity)
才能使其工作。但我想知道我是否必须每次都手动执行
似乎做$em->refresh($entity)
的解决方案是这样做的。我问了Doctrine 2的开发人员