ActiveRecord Transaction Rollback not happening/Postgres

I have these settings using postgresql gem with Postgres 8.4 Installed: development:   adapter: postgresql   host: localhost   database: db_development   username: postgres   password: postgres   encoding: utf8

Code snippet in lib/ rake task: Benchmark.bm(7) do |x|       res = x.report("localdb:populate") do         ruby_obj = YAML.load_file("lib/tasks/populatedb.yml")

        ruby_obj.each_key do |key|           h = ruby_obj[key]           begin             ActiveRecord::Base.transaction do               msg = Message.new               msg.name= h['name']               msg.message_key= h['message_key']               msg.category= h['category']               msg.displayable=true if h['displayable']               msg.save             end           rescue => e             logger.info "Error happened #{e.backtrace}"           end

        end       end

the populatedb.yml just has some yml Message key. Message is a ActiveRecord Object. It has validation on message_key.

I intentionally want that either all messages get populated or none and to check that I make message_key same for 2 messages with validates_uniqueness_of :message_key.

My problem is that even is the same key exists in populatedb.yml data, everything works well. No rollback.

Is this code correct? ActiveRecord::Base.transaction do               msg = Message.new               msg.name= h['name']               msg.message_key= h['message_key']               msg.category= h['category']               msg.displayable=true if h['displayable']               msg.save             end

Do I need to do anything special in Postgres Installation DB Set up?

Does the postgres adapter handle this situation?

Thanks in advance.

Well your transaction only wraps a single insert, so only that insert could get rolled back. Furthermore, save doesn't raise an exception if saving fails (save! does) so you'd never get a rollback anyway.

Fred

Frederick Cheung wrote:

� � � � � � � msg.category= h['category'] � � � � � � � msg.displayable=true if h['displayable'] � � � � � � � msg.save � � � � � � end

Do I need to do anything special in Postgres Installation DB Set up?

Well your transaction only wraps a single insert, so only that insert could get rolled back. Furthermore, save doesn't raise an exception if saving fails (save! does) so you'd never get a rollback anyway.

Fred

I actually changed this as follows after the post and it does work. The ROLLBACK shows in the log also. Thanks Fred though. SIlly to overlook it. Also, the ROLLBACK happens at the validation level itself. I don't have to throw the exception or even catch it.

begin           ActiveRecord::Base.transaction do             ruby_obj.each_key do |key|               h = ruby_obj[key]               msg = Message.new               msg.name= h['name']               msg.message_key= h['message_key']               msg.category= h['category']               msg.displayable=true if h['displayable']               msg.save!             end           end         rescue => e           logger.info "Error happened #{e.backtrace}"           #throw e         end