On 8 Mar 2009, at 10:39, gaveeno wrote: > > rescue ActiveRecord::StaleObjectError > credit_balance.reload > > ## i stopped the code here and > ## saw that credit_balance didn't > ## reflect the changes made in > ## the console (see below) even though > ## I checked via SQL and the > ## database DID reflect the update. >
I'm not entirely sure if this is what you are asking, but the before_*, save, after* sequence all runs in one transaction. You should read up on transaction isolation levels (ie what changes from other transactions a given transaction sees) Fred > retry > end > end > > > ## code executed in the console > ## after credit balance was loaded by > ## the update_credits method above. > ## 1 is the id of the company whose credit > ## balance I'm testing the code above with. > ## I updated used_credits with a random num. > > c = CreditBalance.find(1) > c.update_attribute(:used_credits,999) > > > On Mar 8, 3:32 am, gaveeno <[email protected]> wrote: >> This error's driving me crazy... >> >> I'm trying to test the code that I wrote to rescue the >> ActiveRecord::StaleObjectError exception...this is the exception that >> can occur when a model with optimistic locking is updated by multiple >> processes concurrently. For some reason, though, model.reload >> doesn't >> seem to want to actually reload the model from the db when I rescue >> the exception. >> >> This is the code I'm using: >> >> ### Model >> class SmsTxn < ActiveRecord::Base >> >> after_create :update_credits >> >> def update_credits >> >> return unless self.company >> credit_balance ||= self.company.credit_balance >> >> ## using ruby-debug, i stopped the code here and executed >> ## the commands below (using script/console) >> >> credit_balance.used_credits += 1 >> credit_balance.save >> credit_balance.used_credits >> >> rescue ActiveRecord::StaleObjectError >> >> credit_balance.reload >> >> ## i stopped the code here and saw that credit_balance didn't >> reflect the >> ## changes made in the console (see below) even though I checked >> via SQL >> ## and the database DID reflect the update. >> >> retry >> >> end >> end >> >> ### code executed in the console after credit balance was loaded by >> the update_credits method above >> c = CreditBalance.find(1) # 1 is the id of the company whose credit >> balance >> # I'm testing the code above >> with >> >> c.update_attribute(:used_credits,999) # I assigned a random number >> for >> used_credits >> >> For some reason this is causing an infinite >> loop...credit_balance.reload is not reloading the model from what's >> in >> the database so when it retries it gives the same error. I first >> tried this test by updating the value directly via SQL, but that gave >> me the same problem so I thought that maybe the way optimistic >> locking >> works it wasn't recognizing the change because it was outside of the >> Rails framework. >> >> Anybody know what I'm doing wrong?? >> >> Thanks! >> Gavin > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---

