17

私がこのようなことをしていると仮定します(Active Record Queryingガイドから)

Item.transaction do  
  i = Item.first(:lock => true)  
  i.name = 'Jones'  
  i.save 
end 

ロックはトランザクションの終了時に自動的に解放されますか? Active Query ガイドとActiveRecord::Locking::Pessimistic docsを見てきましたが、ロックが解放された場所を明示的に示している場所が見つかりませんでした。

4

4 に答える 4

25

ロックは Rails の機能ではなく、クエリに lock ステートメントを追加するだけであり、これは使用しているデータベースによって異なります。悲観的ロックは、すべてのクエリが破損しやすいと考える「悲観的」な見方をします。したがって、トランザクションが終了するまで、選択した行をロックします。だからロック>クエリ>ロック解除。これらはデータベースごとにかなり一貫していますが、知っておくべきデータベース固有のことについては、使用しているデータベースのドキュメントを読むことをお勧めします。

これは、楽観的ロックと悲観的ロックに関する良いスレッドで、私よりもうまく説明しています。 楽観的ロックと悲観的ロック

于 2010-07-08T17:10:29.727 に答える
5

はい、この種のロックはトランザクションにのみ適用されるため、ロックはトランザクションの最後に自動的に解放されます。トランザクションの外部でこの方法 (悲観的ロック) でレコードをロックすることは意味がありません。

ペシミスティック ロックは DB レベルで適用されます。

以下は、mysql の例を含む説明です: http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html

于 2010-12-17T16:13:02.363 に答える
-3

ロックが確実に解除されるように「保証」ブロックが必要になると思います。

http://ruby-doc.org/core/classes/Mutex.src/M000916.htmlは次のとおりです。

  def synchronize
    lock
    begin
      yield
    ensure
      unlock
    end
  end

ただし、http: //yehudakatz.com/2010/02/07/the-building-blocks-of-ruby/は、そのメソッドのブロック構造が自動的にロック解除されることを示唆しているようです。

于 2010-07-08T16:13:36.050 に答える