Hi all,
I was testing, and found a nested transaction (which I know is bad), and there's something I don't understand. If an exception occurs during a transaction, it is supposed to roll back. In a nested transaction, where an exception is raised out of the 'inner' transaction, this doesn't occur. However, if I catch the exception and manually call 'connection.rollback_db_transaction', it works, e.g.:
Applicant.transaction do a = Applicant.find(1) begin Applicant.transaction do a.first_name = 'bar' a.save! raise "Foo" # This does not roll back the transaction... end rescue Applicant.connection.rollback_db_transaction # But this will end end
I don't see why it makes a difference if I call rollback_db_transaction in rescue. I thought that happened automatically. Looking at the source, I can't see where it happens.
Thanks if anyone can clear this up for me. I am trying to use transactional fixtures for all my tests, and this is a sticking point. If I can understand this, I think I can convert them all.