Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php I';当我尝试有条件地插入或更新时,我在我的Laravel应用程序中遇到了竞争条件,有什么建议吗。。。?_Php_Mysql_Laravel_Innodb_Race Condition - Fatal编程技术网

Php I';当我尝试有条件地插入或更新时,我在我的Laravel应用程序中遇到了竞争条件,有什么建议吗。。。?

Php I';当我尝试有条件地插入或更新时,我在我的Laravel应用程序中遇到了竞争条件,有什么建议吗。。。?,php,mysql,laravel,innodb,race-condition,Php,Mysql,Laravel,Innodb,Race Condition,我的用户需要能够将文件上传到我的站点,因此我在前端实现了一个文件上传器小部件。它允许一次进行多个上载,每次上载都会触发一个文件的编码,以将文件保存到数据库中 问题是文件需要作为数组存储在数据库中的一行中(我知道,我知道…遗留原因) 在英文伪代码中,发生了以下情况: Laravel看到一个新文件已上载 Laravel检查是否有任何文件(根本)已上载到此实体 还没有上传任何文件吗?创建新记录以存储该文件 是否已存在此实体的文件?更新现有记录以将此文件添加到阵列 问题是,当第一次快速连续上传多个文件时

我的用户需要能够将文件上传到我的站点,因此我在前端实现了一个文件上传器小部件。它允许一次进行多个上载,每次上载都会触发一个文件的编码,以将文件保存到数据库中

问题是文件需要作为数组存储在数据库中的一行中(我知道,我知道…遗留原因)

在英文伪代码中,发生了以下情况:

  • Laravel看到一个新文件已上载
  • Laravel检查是否有任何文件(根本)已上载到此实体
  • 还没有上传任何文件吗?创建新记录以存储该文件
  • 是否已存在此实体的文件?更新现有记录以将此文件添加到阵列
  • 问题是,当第一次快速连续上传多个文件时,Laravel在第二个文件执行检查以查看是否存在任何文件后,立即将第一个文件输入数据库。因此,我们最终得到了重复的行,而不是将它们更新为单个记录

    如果我一次上传5个文件,通常我会在数据库中得到4行-3个单条目和一个双条目,这会及时赶上进度

    有什么切实可行的办法来解决这个问题吗?我知道我应该在这里使用多对一数据库模式,但为了简洁起见,我已经大大简化了已经很复杂的情况


    这是使用MySQL InnoDB数据库的Laravel 5.2。

    计划a:当您看到一个新文件时,请稍等片刻。然后查找“所有”文件并处理它们

    计划B:将时间戳与记录一起存储。当注意到另一个文件时,查看是否存在具有“最近”时间戳的现有记录。如果是,假设它是同一“组”的一部分

    这两个计划都会偶尔打嗝——主要是因为“立刻”的定义含糊不清

    也许你现在还有另一个问题:当你抓取一个文件时,它被上传了一半,而你得到的是一个不完整的文件


    “真正”的答案是在完成后上传一些“消息”。然后,在看到之前不要开始处理。(我意识到这可能不实用。)

    计划A:当你看到一个新文件时,请稍等片刻。然后查找“所有”文件并处理它们

    计划B:将时间戳与记录一起存储。当注意到另一个文件时,查看是否存在具有“最近”时间戳的现有记录。如果是,假设它是同一“组”的一部分

    这两个计划都会偶尔打嗝——主要是因为“立刻”的定义含糊不清

    也许你现在还有另一个问题:当你抓取一个文件时,它被上传了一半,而你得到的是一个不完整的文件

    “真正”的答案是在完成后上传一些“消息”。然后,在看到之前不要开始处理。(我意识到这可能不现实。)