Laravel可能的竞争条件?

时间:2016-12-03 22:32:30

标签: php laravel eloquent race-condition

我有一个Laravel 5.2后端和Angular 1前端应用程序。他们使用REST API进行通信。有一段代码可以在每次页面加载时更新一些数据库数据(该应用程序是一个浏览器游戏,因此在这种情况下,玩家的资源和单位正在更新/生成),但我遇到了一些问题。

在某些情况下,前端会同时请求多个API端点。如果自上次请求后生成了新单元,则Entityattached() Player模式(多对多关系)。实际情况是,所有3个请求都会尝试附加新的Entity,并最终在SQL error: duplicate key表格中使用pivot(不是确切的措辞)。

问题不是与Eloquent隔离的,例如3个API请求同时导致生成3个报告消息等等。

解决此问题的最佳方法是什么?到目前为止,我已经尝试用DB::transaction包装DB语句,但这似乎没有解决问题(或者我做错了)。

感谢您提供任何有用的回复。

2 个答案:

答案 0 :(得分:0)

根据L5.2 source code attach似乎每次运行时都会将记录插入数据透视表中。

其中一个解决方案可能是将attach替换为syncWithoutDetaching([entity_id])

然而,在角度应用程序中限制单个请求的数量会更好。

答案 1 :(得分:0)

最后,我最终创建了一个在后台永远运行的Laravel命令:

while(true) {
        updateUnitsExample();
        $this->info('Units updated for time '. date("H:m:s"));
        sleep(1);
}