1

テーブル内のいくつかの行を更新したいのですが、それらをロックして、他のプロセスがそれらを同時に更新しないようにしたいと考えています。しかし、他のプロセスにそれらを読み取ってもらいたいのです。

私がそれを達成しようとしている方法は次のようなものです:

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

選択した行をロックしていると思いますがlock(true)(ドキュメントに記載されています)、同時に他の選択に使用できるかどうかはわかりません。だから私は「SHARE MODE」を強制するべきだと思います。

私はこれを試しています:

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 に答える