<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Shugo's Blog comments on PessmisticLocking</title>
    <link>http://blog.shugo.net/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Shugo's Blog comments</description>
    <item>
      <title>"PessmisticLocking" by shugo</title>
      <description>&lt;p&gt;&lt;a href="http://projects.netlab.jp/svn/rails_plugins/pessimistic_locking"&gt;PessimisticLocking&lt;/a&gt; provides row-level pessimistic locking using SELECT FOR UPDATE.&lt;/p&gt;

&lt;p&gt;You can specify the new option :lock of ActiveRecord::Base.find() to lock rows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Account.transaction do
  shugo = Account.find(:first, :conditions =&amp;gt; "name = 'shugo'", :lock =&amp;gt; true)
  yuko = Account.find(:first, :conditions =&amp;gt; "name = 'yuko'", :lock =&amp;gt; true)
  shugo.balance -= 100
  shugo.save
  yuko.balance += 100
  yuko.save
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or you can also use ActiveRecord::Base#lock() instead:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Account.transaction do
  accounts = Account.find(:all, :conditions =&amp;gt; ...)
  account1 = accounts.detect { |account| ... }
  account2 = accounts.detect { |account| ... }
  account1.lock
  account2.lock
  account1.balance -= 100
  account1.save
  account2.balance += 100
  account2.save
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The latter way may be better if you don't need lock all SELECTed rows.&lt;/p&gt;

</description>
      <pubDate>Thu, 11 May 2006 06:35:00 JST</pubDate>
      <guid>&lt;a href="/articles/2006/05/11/pessmisticlocking"&gt;PessmisticLocking&lt;/a&gt;</guid>
      <link>&lt;a href="/articles/2006/05/11/pessmisticlocking"&gt;PessmisticLocking&lt;/a&gt;</link>
    </item>
  </channel>
</rss>
