带负载均衡器的学说

时间:2017-11-06 15:24:13

标签: php doctrine-orm

我正在寻求帮助,因为我已经变成了圈子而没有解决我的问题与php和Doctrine。我不使用Synfony,只使用Doctrine。

这是我的问题:

我打开这样的交易:

$connection = $entityManager->getConnection();
$connection->beginTransaction();

然后我做了

try {
    - SELECT one entity with some criteria (all criteria combined defined a secondary unique key). If no row is found, I create a new entry, otherwise, I save the unique Id.

    ... The rest of the treatment
// Commit the transaction
    $connection->commit();
} catch (\Exception $e) {
    // Rollback the transaction
    $connection->rollBack();

    $entityManager->clear();
    $entityManager->close();
}

在我使用WAMP测试期间,一切正常。但是当我在生产环境中交付时,遇到了麻烦!

我的prod服务器(专业版)配置了负载均衡器和3个后端。当我尝试进行批量测试时(一次拍摄198个请求),在结果中,我在第一个表格中创建了相同的行数次。 我知道这是来自提交是在事务结束时完成的(强制要求可以对整个事务进行回滚)并且3个后端并行处理请求。 我找到的唯一解决方案是在表上手动放置一个LOCK,让第一个请求被处理,并在表中创建行,但我认为这个解决方案很脏。

我尝试使用Doctrine LOCK(悲观)但你不能用findBy锁定一行,显然不是一个尚未创建的行。 我还尝试在我的标准上添加一个唯一索引,当我抛出DUPLICATE KEY错误时,实体管理器已关闭。

有没有人有线索?因为我对Google的无数搜索并没有帮助我解决这个问题。 对不起,我发不出更多代码,因为这是专业的业务。

感谢您的帮助。

0 个答案:

没有答案