Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActiveRecord::StatementInvalid: PG InFailedSqlTransaction

I am trying to create an ActiveRecord Object.But I'm getting this error while creating it.

(0.1ms)  ROLLBACK
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is       aborted, commands ignored until end of transaction block

Any ideas folks regarding the issue.

like image 407
untwal Avatar asked Jan 15 '14 13:01

untwal


5 Answers

None of the other answers fix the root cause of the issue.

The problem is that when Postgres raises an exception, it poisons future transactions on the same connection.

The fix is to rollback the offending transaction:

begin
  ActiveRecord...do something...
rescue Exception => e
  puts "SQL error in #{ __method__ }"
  ActiveRecord::Base.connection.execute 'ROLLBACK'

  raise e
end

See reference.

like image 77
B Seven Avatar answered Nov 18 '22 16:11

B Seven


I had this issue. Just restart the Rails Server and it should work

like image 87
Furkan Ayhan Avatar answered Nov 18 '22 18:11

Furkan Ayhan


This issue was occurring in my test environment, and was caused by the fact that each test was wrapped in its own transaction.

I was using the database_cleaner gem, and have it configured so as NOT to wrap tests in a transaction if they use javascript. So to solve the issue, I added js: true to each spec that was causing this problem. (Even thought the specs did not actually use javascript, this was the most convenient way to ensure that the tests would not be wrapped in a transaction. I am sure there are less hack-ish ways of doing so, though).

For reference, here is the database_cleaner config from spec/support/database_cleaner.rb:

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.clean_with :deletion
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, :js => true) do
    DatabaseCleaner.strategy = :deletion
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end

If you are not using database_cleaner, then probably the reason the tests would be wrapped in transactions would be that the use_transactional_fixtures option is set to true in spec/spec_helper.rb. Try setting it to false.

like image 16
Teddy Widom Avatar answered Nov 18 '22 17:11

Teddy Widom


you can see what really going on in postgresql log, I spend a lot of time to dig into this issue, and finally find out that we misuse upsert gem cause a PG error, only in postgresql log have the real info of what's going on

https://github.com/seamusabshere/upsert/issues/39

like image 8
William Herry Avatar answered Nov 18 '22 17:11

William Herry


I've run into this error when referencing a column in my specs that no longer exists. Make sure your database is up to date and your code doesn't expect a column that doesn't exist.

like image 6
lobati Avatar answered Nov 18 '22 16:11

lobati