1

私は問題を発見しました。それはロックとは何の関係もありませんでした。本番環境では、ジョブがあったようです。作業は永続的に実行され、それは呼び出されました。方法がわかりません! したがって、そのプロセスによって処理されるすべてのジョブは、別の場所で何かを行うことになります! そして、それは私のデータベースではないので、それを強制終了して、すべて正常に動作し始めました。

すみません、無駄遣いをしてしまいました!!


Rails 2.3.8 で作業していることを忘れていました。

異なるバックグラウンド プロセスから同じ行、同じ列を非同期で更新しています。私はdelayed_jobs gemを使用しています。

私がやりたいことは次のとおりです。

ActiveRecord::Base.connection.execute(
"Update table_name set column = column + #{updated_number}
where id = #{self.id}").

私のデータベースは mysql で、書き込むテーブルは InnoDB です。

問題は、そのクエリを異なるdelayed_jobsで実行すると、データの増分が失われることです。(column = column + #{updated_number}) テーブルの現在の値をインクリメントしたい!

各遅延ジョブは異なるプロセスで実行されるため、Rails ロックの使用は機能しません。テーブルに安全に更新を行うためのロックがいくつかある場合のように考えていました。

もう 1 つ、lock! を使用して、私の開発コードで、rake の job:work を 3 回実行します。次に、delayed_job テーブルで、3 つの異なるプロセスが 3 つのジョブをロックしていることを確認し、それが完全に機能する開発コードです。

しかし、そのコードを本番環境に置くと、機能しません。増分データの損失はまだ残っています。

4

1 に答える 1

2

悲観的ロックを使用します。

your_object.with_lock do
  your_object.column += updated_number
  your_object.save!
end

これにより、更新が DB 経由で同期されるようになります。

于 2013-03-22T10:35:07.867 に答える