1

我想更新表中的一些行,并且我想锁定它们以便其他进程不会同时更新它们。但我希望其他进程能够阅读它们。

我试图完成它的方式是这样的:

MyTable.where(mycolumn: "some value").lock(true).update_all(mycolumn: "other value")

我认为这lock(true)是锁定选定的行(这是文档所说的),但我不知道它们是否可同时用于其他选择。所以我认为我应该强制使用“共享模式”。

我正在尝试这个:

MyTable.where(mycolumn: "some value").lock("LOCK IN SHARE MODE").update_all(mycolumn: "other value")

但它引发了这个错误:

STATEMENT:  SELECT  "my_table".* FROM "my_table"  WHERE "my_table"."mycolumn" = $1 LIMIT 1 LOCK IN SHARE MODE
ERROR:  syntax error at or near "LOCK" at character 74

它虽然适用于 SQLite。

4

2 回答 2

2

我想更新表中的一些行,并且我想锁定它们以便其他进程不会同时更新它们。但我希望其他进程能够阅读它们。

这是自动保证的。看起来您正在尝试解决不存在的问题:-)

在第一次更新完成之前,其他进程不会更新。

在 postgres 中,读取永远不会被写入阻塞。

于 2012-10-19T17:21:37.927 回答
1

我对 RoR 一无所知,但是对于 PostgreSQL,我认为您的错误消息中的 SQL 语句不起作用。PostgreSQL 中的锁通常通过以下方式完成: SELECT * from [YOUR_TABLE] where [CONDITION] FOR UPDATE

有关更多文档,请参阅此页面:http ://www.postgresql.org/docs/9.2/static/explicit-locking.html

于 2012-10-18T18:42:56.293 回答