【发布时间】:2023-03-13 22:57:01
【问题描述】:
问题
我有一个 CakePHP 应用程序,我在其中调用了一个存储过程:
$this->FileUpload->query('exec sproc_runjob_ProcessTests', false);
此过程会拾取上传的文件并对其进行处理。有时人们会上传多个文件,它会为每个上传的文件调用一次。
问题是我收到了这个错误:
Database Error
Error: SQLSTATE[42000]:
[Microsoft][SQL Server Native Client 11.0][SQL Server]
SQLServerAgent Error: Request to run job ProcessTests
(from User [redacted]) refused because the job already has
a pending request from User [redacted].
SQL Query: exec sproc_runjob_ProcessTests
据我所知,这意味着存储过程不能同时运行——我必须为每个进程串行运行存储过程,这对我们新奇的多核服务器来说是一种耻辱。
我们想到的解决方案
-
串行运行存储过程
基本上这里的想法是调用存储过程一次,如果它已经在运行则忽略它的失败。在 sproc 调用结束时,它会检查数据库以查看它是否需要再次运行(如果有任何“新”文件)并在需要时再次运行自己。
-
不要使用现有的存储过程
由于时间限制,这会很困难,但如果有人对我们应该这样做的方式有很好的建议,我很乐意听到。
提前致谢!
搜索结果
-
貌似this guy也有同样的问题,打电话前先检查一下工作状态来解决。也许我可以在调用 sproc 之前从 PHP 中执行此操作?
-
Here's a mention 称为 Service Broker。这实际上可能是我正在寻找的,但我仍然喜欢任何输入。
提前致谢!
【问题讨论】:
标签: php sql-server stored-procedures