diff --git a/lib/aasm/persistence/active_record_persistence.rb b/lib/aasm/persistence/active_record_persistence.rb index d14f6390..0196272b 100644 --- a/lib/aasm/persistence/active_record_persistence.rb +++ b/lib/aasm/persistence/active_record_persistence.rb @@ -132,7 +132,7 @@ def aasm_ensure_initial_state end def aasm_fire_event(name, options, *args) - transaction do + transaction(:requires_new => true) do super end end diff --git a/spec/unit/persistence/active_record_persistence_spec.rb b/spec/unit/persistence/active_record_persistence_spec.rb index 19a8e645..efe983c9 100644 --- a/spec/unit/persistence/active_record_persistence_spec.rb +++ b/spec/unit/persistence/active_record_persistence_spec.rb @@ -179,9 +179,10 @@ end describe 'transactions' do + let(:worker) { Worker.create!(:name => 'worker', :status => 'sleeping') } + let(:transactor) { Transactor.create!(:name => 'transactor', :worker => worker) } + it 'should rollback all changes' do - worker = Worker.create!(:name => 'worker', :status => 'sleeping') - transactor = Transactor.create!(:name => 'transactor', :worker => worker) transactor.should be_sleeping worker.status.should == 'sleeping' @@ -189,6 +190,17 @@ transactor.should be_running worker.reload.status.should == 'sleeping' end - end + it "should rollback all changes in nested transaction" do + transactor.should be_sleeping + worker.status.should == 'sleeping' + + Worker.transaction do + lambda { transactor.run! }.should raise_error(StandardError, 'failed on purpose') + end + + transactor.should be_running + worker.reload.status.should == 'sleeping' + end + end end