0

我在 Rails 模型中有以下代码:

self.with_lock do
  # Lots of code
end

这会生成一个 SELECT FOR UPDATE 查询。

我意识到它在我的生产环境中工作。在查看了mysql手册后,我发现了以下信息:

Locking of rows for update using SELECT FOR UPDATE only applies when autocommit is disabled

正如预期的那样,自动提交在我的生产环境中是开启的。

我有什么选择?

我无法禁用自动提交,因为同一服务器中的 PHP 应用程序依赖于它。我还需要锁定此代码,因为它会导致并发连接出现问题。

我找不到任何宝石或可以帮助我的东西。就像锁定临时文件夹中的文件一样。我需要自己编码吗?

4

1 回答 1

1

是的,但是您从手册中复制的那句话的其余部分如下:

...(either by beginning transaction with START TRANSACTION or by setting autocommit to 0. If autocommit is enabled, the rows matching the specification are not locked.

因此,您需要做的就是启动一个事务,然后自动提交将被禁用。这正是您正在做的事情。

您找不到可以满足您需求的 gem,因为 Rails 已经在这样做了。

SELECT FOR UPDATE您可以通过跟踪日志并确保出现在事务块中来确认 Rails 正在做正确的事情。

于 2013-04-10T21:04:32.607 回答