【发布时间】:2012-02-27 21:55:12
【问题描述】:
我目前有一个可以从客户端触发 N 次的 XHR 请求。此请求由服务器处理,每个请求通常在数据库中创建一个新行(所有学说/xml)。
在我persist() 对象之前,我确定是否有一个唯一的文件名(我正在上传资产),我通过覆盖persist()、调用我的getUniqueFilename() 然后调用parent::persist 来做到这一点。
当我使用相同的文件名执行多个 XHR 请求时,我得到一个竞争条件。如果多个线程同时运行并检查数据库中的重复项以生成唯一的文件名,会发生什么情况。
- 上传文件
- 检查数据库是否存在文件名
- 增加文件名(例如:filename_1)
但是,当多个线程中发生多个 XHR 请求时,会出现竞争条件,即多个文件以相同的名称插入到数据库中(filename_1 生成多次)。
我认为解决这个问题的方法是
- 一个 mysql 触发器
- 为文件名的表添加唯一约束,并在代码中包装在 try/catch 中
你会怎么做?
【问题讨论】:
-
如果文件名需要唯一,我会添加一个约束。让数据层解决这个问题。但无论如何,如果
getUniqueFilename()做得如此“糟糕”,你为什么还要拥有它呢? -
好点 - 最初我们从未测试/考虑过用户在同一请求中上传具有相同文件名的资产(或可能发生的竞争条件)。在测试这个错误时,我正在尝试确定解决它的最佳方法。
标签: php concurrency doctrine symfony