問題を更新する2人の問題を処理しますか?
私はグーグルでAPIを調べましたが、何も見つかりませんでした
Rails 3+、Ruby 1.9.3
問題を更新する2人の問題を処理しますか?
私はグーグルでAPIを調べましたが、何も見つかりませんでした
Rails 3+、Ruby 1.9.3
counter_cacheを使用する場合、レコードの挿入とカウンターの更新は同じトランザクションで実行されます。ただし、これは操作の原子性を保証するものではありません。2人の更新の問題を回避するために、レコードを「ロック」する必要がある場合があります。
この優れた記事を参照してください。これはredis-objectsgemに関するものですが、最初の2つの部分では、ActiveRecordの問題と解決策を完全に説明しています。
簡単な答え:いいえ。Cédricが言及しているように、Railsはトランザクションの内部を更新するため、同じレコードを更新するバックグラウンドプロセスがある場合、レコードのブロックをcounter_cache
使用して両方の更新を実行しない限り、デッドロックエラーが発生します。with_lock
与えられた答えは、アトミックなSQL UPDATEを実行するため、少なくともRails5.xでは正しくないようです。
UPDATE .... SET counter = counter + 1